Error Handling System
Run ID: 69cc4d5e8f41b62a970c25ef2026-03-31Development
PantheraHive BOS
BOS Dashboard

Error Handling System: Production-Ready Code Generation (Node.js/Express Example)

This document provides a comprehensive, detailed, and production-ready code implementation for a robust error handling system. The goal is to centralize error management, improve application resilience, enhance security by preventing sensitive data leaks, and provide a better developer and user experience.

We will use Node.js with the Express framework for this example, demonstrating common patterns applicable to many web application environments.


1. Introduction to the Error Handling System

A well-designed error handling system is critical for any production application. It ensures that your application behaves predictably when unexpected situations arise, provides meaningful feedback to users and developers, and prevents crashes.

Key Objectives:


2. Core Components & Design Principles

Our error handling system will consist of the following components:

  1. Custom Error Classes: Extend JavaScript's native Error object to create application-specific error types (e.g., NotFoundError, ValidationError). This allows for programmatic identification and handling of different error scenarios.
  2. Centralized Error Handling Middleware: An Express middleware function that catches all errors thrown in the application. It will analyze the error, log it, and send a standardized JSON response to the client.
  3. Robust Logger: An integrated logging solution (e.g., Winston) to capture error details, stack traces, and contextual information.

Design Principles:


3. Production-Ready Code Implementation (Node.js/Express)

This section provides the code for the error handling system.

3.1. Logger Configuration (src/utils/logger.js)

We'll use winston for robust logging.

text • 212 chars
#### 3.3. Global Error Handling Middleware (`src/middlewares/errorHandler.js`)

This middleware is the central point for all error processing. It determines the type of error and sends an appropriate response.

Sandboxed live preview

Project: Error Handling System - Study Plan

1. Executive Summary

This document outlines a comprehensive, 4-week study plan designed to equip software developers, architects, and technical leads with the necessary knowledge and practical skills to design, implement, and manage robust and resilient error handling systems. Effective error handling is crucial for building stable, maintainable, and user-friendly applications, especially in complex distributed environments. This plan covers fundamental concepts, language-specific implementations, advanced architectural patterns, and operational best practices, ensuring a holistic understanding of the subject matter.

2. Learning Objectives

By the end of this study plan, participants will be able to:

  • Conceptual Understanding:

* Differentiate Error Types: Identify and categorize various error types (e.g., system, business logic, network, user input, expected vs. unexpected) and understand their appropriate handling strategies.

* Grasp Core Principles: Explain the fundamental principles of exception handling, error codes, return values, assertions, and logging.

* Evaluate Trade-offs: Understand the trade-offs between different error handling philosophies, such as "Fail-Fast" versus "Graceful Degradation."

  • Technical Proficiency:

* Implement Language-Specific Handling: Effectively implement error handling mechanisms in at least two common programming languages (e.g., Python, Java, C#,

javascript

// src/app.js

const express = require('express');

const morgan = require('morgan'); // HTTP request logger middleware

const helmet = require('helmet'); // Security headers

const rateLimit = require('express-rate-limit'); // Rate limiting

const mongoSanitize = require('express-mongo-sanitize'); // Data sanitization

const xss = require('xss-clean'); // Cross-site scripting protection

const hpp = require('hpp'); // HTTP Parameter Pollution protection

const cors = require('cors'); // Cross-Origin Resource Sharing

const compression = require('compression'); // Gzip compression

const { NotFoundError, AppError } = require('./utils/appError');

const globalErrorHandler = require('./middlewares/errorHandler');

const logger = require('./utils/logger');

// --- Start Express App ---

const app = express();

// 1) GLOBAL MIDDLEWARES

// Implement CORS

app.use(cors());

// Access-Control-Allow-Origin *

// app.use(cors({ origin: 'https://www.your-frontend.com' })); // For specific origins

// Set security HTTP headers

app.use(helmet());

// Development logging

if (process.env.NODE_ENV === 'development') {

app.use(morgan('dev'));

logger.info('Morgan HTTP logging enabled.');

}

// Limit requests from same API

const limiter = rateLimit({

max: 100, // 100 requests per hour per IP

windowMs: 60 60 1000,

message: 'Too many requests from this IP, please try again in an hour!'

});

app.use('/api', limiter); // Apply to routes starting with /api

// Body parser, reading data from body into req.body

app.use(express.json({ limit: '10kb' })); // Max 10kb body size for JSON

app.use(express.urlencoded({ extended: true, limit: '10kb' })); // For form data

// Data sanitization against NoSQL query injection

app.use(mongoSanitize());

// Data sanitization against XSS

app.use(xss());

// Prevent parameter pollution

app.use(hpp({

whitelist: [

// Example: allow price to be duplicated in query string for range search

// 'duration', 'ratingsQuantity', 'ratingsAverage', 'maxGroupSize', 'difficulty', 'price'

]

}));

// Compress all responses

app.use(compression());

// Serving static files

app.use(express.static(${__dirname}/public));

// 2) ROUTES

// Example route

app.get('/api/v1/test', (req, res) => {

res.status(200).json({ message: 'API is working!' });

});

// Example route that might throw an error

app.get('/api/v1/error-test', (req, res, next) => {

// Simulate an operational error (e.g., invalid user input)

if (req.query.fail === 'true') {

return next(new AppError('This is a simulated operational error!', 400));

}

// Simulate a programming error (e.g., trying to access undefined property)

if (req.query.crash === 'true') {

const obj = undefined;

obj.property; // This will cause a TypeError

}

res.status(200).json({ message: 'No error simulated.' });

});

// Handle unhandled routes (404 Not Found)

app.all('*', (req, res, next) => {

next(new NotFoundError(Can't find ${req.originalUrl} on this server!));

});

// 3) GLOBAL ERROR HANDLING MIDDLEWARE

gemini Output

Error Handling System: Comprehensive Deliverable

Project: Error Handling System Implementation

Date: October 26, 2023

Prepared For: [Customer Name/Team]

Prepared By: PantheraHive Solutions Team


1. Executive Summary

This document outlines the comprehensive design and implementation strategy for a robust Error Handling System. The primary objective is to establish a standardized, efficient, and proactive mechanism for identifying, logging, monitoring, categorizing, and resolving errors across your applications and infrastructure. This system will significantly enhance system stability, improve user experience, reduce operational overhead, and provide actionable insights for continuous improvement. By centralizing error management, we aim to minimize downtime, accelerate incident response, and foster a culture of reliability.


2. System Objectives and Key Benefits

The implementation of this Error Handling System is designed to achieve the following core objectives and deliver significant benefits:

  • Proactive Error Detection: Identify issues before they impact end-users or critical business operations.
  • Accelerated Incident Response: Streamline the process from error detection to resolution, reducing Mean Time To Recovery (MTTR).
  • Improved System Stability & Reliability: Minimize recurring errors and prevent cascading failures.
  • Enhanced User Experience: Reduce instances of service disruption and unexpected behavior.
  • Centralized Error Visibility: Provide a single pane of glass for all error-related information.
  • Actionable Insights: Generate data-driven insights to identify root causes, performance bottlenecks, and areas for system improvement.
  • Reduced Operational Overhead: Automate error handling processes where possible, freeing up engineering resources.
  • Compliance & Auditability: Maintain detailed logs for auditing, post-mortem analysis, and compliance requirements.

3. Core Components of the Error Handling System

The proposed Error Handling System will be composed of several interconnected components working in concert:

  • Error Logging Framework: Standardized libraries and methods for capturing error details across various application layers (frontend, backend, database, infrastructure).
  • Centralized Log Aggregation: A robust platform to collect, store, and index logs from all sources into a unified repository.
  • Monitoring & Alerting Engine: Tools and configurations to continuously monitor aggregated logs for anomalies and trigger alerts based on predefined rules.
  • Error Categorization & Prioritization Module: A system for classifying errors by type, severity, and business impact, enabling intelligent routing.
  • Incident Management Integration: Seamless integration with existing incident management platforms (e.g., Jira, PagerDuty, ServiceNow) for automated ticket creation and workflow management.
  • Reporting & Analytics Dashboard: Visualizations and reports to track error trends, MTTR, common failure points, and system health.
  • Configuration Management: A centralized system to manage error handling rules, alert thresholds, and notification policies.

4. Error Categorization and Prioritization Strategy

A critical aspect of effective error handling is the ability to quickly understand the nature and impact of an error. We propose the following categorization and prioritization strategy:

4.1. Error Categories

Errors will be classified based on their origin and nature:

  • System Errors: Low-level infrastructure issues (e.g., disk space, memory, network, OS failures).
  • Application Errors: Exceptions within application code (e.g., NullPointerExceptions, database connection errors, API failures, business logic errors).
  • Database Errors: Issues related to database operations (e.g., query timeouts, connection pool exhaustion, schema violations).
  • External Service Errors: Failures when interacting with third-party APIs or external microservices.
  • Security Errors: Authentication/authorization failures, suspicious activity, data breaches.
  • User Interface Errors: Frontend rendering issues, client-side script errors, validation failures.

4.2. Error Severity and Prioritization

Each error will be assigned a severity level, which dictates its priority and the expected response time. This will be dynamically assigned based on predefined rules (e.g., error type, frequency, affected users, business impact).

| Severity Level | Description ## Error Handling System: Implementation & Strategy

This document provides a detailed plan for establishing an effective and reliable error handling system. It covers the framework, logging, monitoring, and integration aspects to ensure comprehensive coverage and rapid resolution.


1. Introduction and System Overview

The Error Handling System is designed to be the central nervous system for managing errors across your entire technology stack. Its primary goal is to shift from reactive problem-mortem analysis to proactive incident prevention and accelerated resolution. This system will provide a unified approach to error management, ensuring consistency, visibility, and accountability.

Key Principles:

  • Standardization: Consistent error logging formats and handling procedures across all services.
  • Visibility: Centralized dashboards and alerts for real-time insights into system health.
  • Actionability: Clear pathways for incident response, root cause analysis, and resolution.
  • Automation: Leverage automation to reduce manual effort in detection, notification, and initial remediation steps.
  • Continuous Improvement: Data-driven insights to identify recurring issues and drive architectural enhancements.

2. Error Logging Framework and Best Practices

Establishing a robust logging framework is

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