Microservice Scaffolder
Run ID: 69cbae3b61b1021a29a8b5412026-03-31Development
PantheraHive BOS
BOS Dashboard

Microservice Scaffolder - Step 1: Architecture Plan

This document outlines the detailed architectural plan for the microservices that will be generated by the "Microservice Scaffolder". The goal is to produce a robust, scalable, maintainable, and production-ready microservice structure, adhering to modern best practices for cloud-native applications.


1. Core Architectural Principles for Generated Microservices

The generated microservices will embody the following core principles to ensure high quality and operational efficiency:

2. Standardized Project Structure

The scaffolder will generate a consistent, well-organized project directory structure, promoting discoverability and maintainability.

text • 1,584 chars
.
├── src/                     # Source code directory
│   ├── api/                 # API endpoints, request/response models, validation logic
│   ├── service/             # Core business logic and domain services
│   ├── repository/          # Data Access Layer (interfaces with database/external services)
│   ├── config/              # Application configuration management (e.g., environment variable parsing)
│   ├── models/              # Database models / ORM definitions / Domain entities
│   ├── tests/               # Unit, integration, and potentially end-to-end tests
│   ├── main.py / app.ts / main.go / Application.java # Main application entry point
│   └── utils/               # Common utilities, helper functions, cross-cutting concerns
├── Dockerfile               # Docker container definition for the microservice
├── docker-compose.yml       # Local development setup (service + database + other dependencies)
├── README.md                # Comprehensive project documentation, setup instructions, API usage
├── requirements.txt / package.json / go.mod / pom.xml # Language-specific dependency manifest
├── .gitignore               # Files/directories to ignore in version control
├── .env.example             # Example environment variables for local development
├── ci_cd/                   # CI/CD pipeline configurations (e.g., GitHub Actions, GitLab CI)
├── deployment/              # Deployment manifests (e.g., Kubernetes, Helm, Terraform/CloudFormation)
└── docs/                    # Generated API documentation (e.g., OpenAPI spec, postman collections)
Sandboxed live preview

3. API Layer (Entry Point)

  • RESTful API Design: Adherence to standard REST principles, using appropriate HTTP methods (GET, POST, PUT, DELETE, PATCH), status codes, and resource-based URLs.
  • Framework Options: The scaffolder will provide choices for popular frameworks based on the selected language:

* Python: FastAPI (preferred for performance and built-in features), Flask (for simpler, lightweight services).

* Node.js: Express.js (with TypeScript for type safety and maintainability).

* Go: Gin (for high performance and minimalist API development).

* Java: Spring Boot (for robust, enterprise-grade applications with extensive ecosystem support).

  • Request/Response Validation: Automatic schema validation using framework-specific tools (e.g., Pydantic for FastAPI, Joi for Express, DTOs with validation annotations for Spring Boot).
  • Centralized Error Handling: Global exception handling middleware or aspects to ensure consistent, structured error responses across the API.

*

gemini Output

This document details the comprehensive output for Step 2 of 3: gemini → generate_code within the "Microservice Scaffolder" workflow. The goal of this step is to generate a complete, production-ready microservice with all necessary components, including API routes, database models, Docker setup, testing framework, CI/CD configuration, and deployment scripts.

We have chosen a common and robust technology stack for this example:

  • Language/Framework: Python 3.11 with FastAPI (for high performance and automatic OpenAPI documentation).
  • Database: PostgreSQL (for relational data storage).
  • ORM: SQLAlchemy 2.0 with Pydantic (for data validation and serialization).
  • Containerization: Docker and Docker Compose.

*

gemini Output

Microservice Scaffolding Complete: Review & Documentation

Dear Customer,

We are delighted to inform you that the "Microservice Scaffolder" workflow has successfully completed its final step. You now have a fully generated, production-ready microservice scaffold, complete with a robust development environment, testing framework, and comprehensive CI/CD and deployment configurations.

This deliverable provides a detailed overview of the generated microservice, its key components, and actionable steps to get started, customize, and deploy your new service.


1. Introduction to Your New Microservice

Your new microservice, provisioned for a Python 3.10+ environment using the FastAPI framework, is designed for high performance, ease of development, and maintainability. It integrates SQLAlchemy 2.0+ as its Object-Relational Mapper (ORM) with a PostgreSQL database backend, ensuring robust data handling.

The scaffold provides a foundational structure for a typical CRUD (Create, Read, Update, Delete) service, ready for you to adapt to your specific business logic.

Key Features:

  • Modern Python Stack: FastAPI, Pydantic, SQLAlchemy.
  • Containerized Development: Docker and Docker Compose for consistent environments.
  • Database Management: PostgreSQL with Alembic for migrations.
  • Automated Testing: Pytest framework for unit and integration tests.
  • CI/CD Ready: Pre-configured GitHub Actions for automated build, test, and deployment.
  • Deployment Ready: Placeholder scripts for cloud-native deployments.
  • Comprehensive Documentation: Auto-generated API docs (Swagger UI) and clear project structure.

2. Detailed Breakdown of Generated Components

Your new microservice repository includes the following critical components:

2.1. Docker Setup

  • Dockerfile: Defines the environment for your microservice, based on a lightweight Python image. It includes dependencies, application code, and entrypoint configuration.

* Actionable: This file is optimized for production deployment, ensuring your application runs consistently across environments.

  • docker-compose.yml: Configures a multi-container local development environment. It orchestrates your FastAPI application, a PostgreSQL database, and an Adminer (or similar) database management tool.

* Actionable: Use this file to bring up your entire local development stack with a single command.

  • .dockerignore: Specifies files and directories to exclude from the Docker build context, optimizing build times and image sizes.

2.2. API Routes and Endpoints

  • app/main.py: The entry point for your FastAPI application, initializing the app, database connection, and including API routers.
  • app/api/v1/endpoints/*.py: Modularized API endpoints (e.g., users.py, items.py). Each file defines a set of related RESTful routes (e.g., GET /api/v1/users, POST /api/v1/users, GET /api/v1/users/{user_id}).

* Structure: Endpoints are designed following RESTful principles, using Pydantic models for request body validation and response serialization.

* Actionable: Extend these files to add new business logic and API functionalities.

  • Automatic API Documentation: FastAPI automatically generates interactive API documentation (Swagger UI and ReDoc) accessible at /docs and /redoc respectively, when the service is running.

* Actionable: This documentation is invaluable for developers and consumers of your API.

2.3. Database Models and Migrations

  • app/models/*.py: Defines SQLAlchemy ORM models (e.g., User, Item) corresponding to your database tables. These models include schema definitions, relationships, and basic validation.

* Actionable: Modify or add new models here to represent your application's data structures.

  • app/schemas/*.py: Pydantic models for data validation, serialization, and deserialization, used for API request/response bodies and data transfer objects (DTOs).

* Actionable: These separate models ensure a clean separation between your internal ORM models and your external API contract.

  • alembic/ directory: Contains configuration for Alembic, the database migration tool.

alembic/versions/.py: Placeholder for database migration scripts.

* Actionable: Use Alembic to manage schema changes in a controlled and versioned manner. (e.g., alembic revision --autogenerate -m "Add new_field to User", alembic upgrade head).

2.4. Testing Framework

  • tests/ directory: Contains the testing suite for your microservice, utilizing pytest.

tests/unit/.py: Example unit tests for individual functions, models, and utilities.

tests/integration/.py: Example integration tests that interact with the API endpoints and a test database (configured to use an in-memory SQLite or a separate Dockerized PostgreSQL for tests).

* tests/conftest.py: Fixtures for setting up a test client, database sessions, and test data.

* Actionable: Run tests with pytest from the root directory. This setup encourages a TDD/BDD approach and ensures code quality.

2.5. CI/CD Pipeline Configuration (GitHub Actions Example)

  • .github/workflows/main.yml: A pre-configured GitHub Actions workflow for continuous integration and continuous deployment.

* Triggers: Configured to run on pushes to main and on pull requests.

* Stages:

1. Build & Lint: Installs dependencies, runs linters (e.g., Black, Flake8), and builds the Docker image.

2. Test: Runs the pytest suite, ensuring all tests pass.

3. Deploy (Staging): (Placeholder) Pushes the Docker image to a container registry and triggers a deployment to a staging environment. This step requires configuration of secrets (e.g., DOCKER_USERNAME, DOCKER_PASSWORD, KUBERNETES_CREDENTIALS).

4. Deploy (Production): (Placeholder) A manual trigger or a more controlled automated deployment to production, typically following successful staging deployment and approvals.

* Actionable: Customize this file to integrate with your preferred cloud provider (AWS, GCP, Azure) and container registry. Set up required GitHub Secrets for secure credential handling.

2.6. Deployment Scripts and Infrastructure as Code (IaC)

  • deploy/ directory: Contains placeholder scripts and configurations for cloud deployment.

* deploy/kubernetes/: Example Kubernetes manifests (Deployment, Service, Ingress) for deploying your microservice to a Kubernetes cluster.

* deploy/terraform/: Example Terraform configurations for provisioning cloud resources (e.g., EKS cluster, RDS database, load balancers) if you opt for IaC.

deploy/scripts/.sh: Utility scripts for common deployment tasks (e.g., build_and_push.sh, apply_kube_configs.sh).

* Actionable: These are templates that you will need to adapt to your specific cloud provider and infrastructure requirements. We recommend using a robust IaC tool like Terraform or CloudFormation for managing your infrastructure.


3. Getting Started: Running Your Microservice Locally

Follow these steps to get your new microservice up and running on your local machine:

  1. Prerequisites:

* Git installed.

* Docker Desktop (or Docker Engine and Docker Compose) installed and running.

* Python 3.10+ (optional, as Docker will manage the environment, but useful for running tests/scripts outside Docker).

  1. Clone the Repository:

    git clone <YOUR_REPOSITORY_URL>
    cd <YOUR_MICROSERVICE_DIRECTORY>
  1. Build and Run with Docker Compose:

This command will build your application's Docker image, create a PostgreSQL database container, and start both services.


    docker-compose up --build -d

* The -d flag runs the services in detached mode (in the background).

  1. Verify Services:

* Check if containers are running:


        docker-compose ps

* Access the FastAPI application: Open your web browser and navigate to http://localhost:8000. You should see a "Hello World!" or similar welcome message.

* Access the interactive API documentation (Swagger UI): http://localhost:8000/docs

* Access the database management tool (Adminer): http://localhost:8080 (Default credentials often postgres/postgres for the database server, postgres/password for the user/password, database app_db).

  1. Run Tests:

While the services are running, you can execute the test suite:


    docker-compose exec app pytest

This command runs pytest inside the application container.


4. Customization and Extension Guide

This scaffold is a starting point. Here's how you can customize and extend it:

  • Adding New Features:

* Create new Pydantic schemas in app/schemas/.

* Define new SQLAlchemy models in app/models/.

* Implement new CRUD operations or business logic in app/crud/ (if you choose to separate logic) or directly within endpoint functions.

* Create new API endpoints in app/api/v1/endpoints/. Remember to include your new router in app/main.py.

  • Database Schema Changes:

* Modify your SQLAlchemy models in app/models/.

* Generate a new Alembic migration script:


        docker-compose exec app alembic revision --autogenerate -m "Description of your changes"

* Review the generated script in alembic/versions/.

* Apply the migration to your database:


        docker-compose exec app alembic upgrade head
  • Configuration:

* Environment variables are handled via .env file for local development (referenced by docker-compose.yml) and will be passed via CI/CD secrets for production.

* Refer to app/core/config.py for how settings are loaded.

  • Logging & Monitoring:

* The scaffold includes basic logging configuration. Integrate with external logging services (e.g., ELK stack, Datadog, Splunk) by configuring your app/core/logging.py or similar.

* Consider adding Prometheus/Grafana for metrics and monitoring.

  • Security:

* The scaffold provides a basic structure. Implement robust authentication (e.g., OAuth2, JWT) and authorization (RBAC) mechanisms using FastAPI's dependency injection system.

* Ensure all sensitive data is handled securely and environment variables are properly managed.


5. Generated Documentation

The generated repository includes:

  • README.md: A comprehensive project README outlining the microservice's purpose, setup instructions, development guidelines, and deployment information. This is your primary source of documentation.
  • API Documentation: As mentioned, FastAPI provides interactive Swagger UI and ReDoc at /docs and /redoc respectively, offering live, up-to-date documentation of your API endpoints.

6. Next Steps and Support

We encourage you to thoroughly review the generated code, experiment with the local setup, and begin customizing the microservice to fit your specific needs.

  • Review and Feedback: Provide us with any feedback on the generated scaffold. Your input is valuable for continuous improvement.
  • Further Assistance: Should you require assistance with deploying to specific cloud environments, integrating advanced features, or scaling your microservice, please do not hesitate to reach out to our support team. We are here to help you succeed.

Thank you for choosing PantheraHive's Microservice Scaffolder. We look forward to seeing your innovative solutions come to

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