Full Stack App Blueprint
Run ID: 69cc126404066a6c4a1691be2026-03-31Development
PantheraHive BOS
BOS Dashboard

Full Stack Application Blueprint: Architecture Plan

This document outlines a comprehensive architecture plan for a modern full-stack application, encompassing frontend, backend, database, authentication, deployment, and testing strategies. This blueprint provides a solid foundation for development, ensuring scalability, maintainability, and security.


1. Overall Architecture Overview

The application will adopt a decoupled, service-oriented architecture, separating the frontend client from the backend API. This approach allows for independent development, scaling, and technology choices for each layer.

Conceptual Diagram:

text • 1,588 chars
+-------------------+       +-------------------+       +-------------------+
|   User Devices    |       |     CDN/Load      |       |    Cloud Native   |
| (Web Browser, App)|       |      Balancer     |       |   Services (e.g., |
+---------+---------+       +---------+---------+       |  Auth0, S3, Redis)|
          |                           |                   +---------+---------+
          |                           |                             |
          |       HTTPS               |                             |
          |                           |                             |
          v                           v                             v
+-------------------+           +-------------------+         +-------------------+
|     Frontend      |<--------->|     Backend       |         |     External      |
|  (React/Vue/Angular)| API Calls |   (Node.js/Python/  |<------->|    Integrations   |
| (Static Assets)    |           |   Go/Java)        |         | (e.g., Payment GW, |
+---------+---------+           +---------+---------+         |   Email Service)  |
          |                               |                     +-------------------+
          |                               |
          |        Database Access        |
          v                               v
+-------------------+                   +-------------------+
|     Database      |<----------------->|     Caching       |
| (PostgreSQL/MySQL/ |                   |   (Redis/Memcached)|
|   MongoDB)        |                   +-------------------+
+-------------------+
Sandboxed live preview

4. Database Design

A robust and scalable database solution is critical for data persistence.

  • Database Type: PostgreSQL (Relational Database). Chosen for its reliability, ACID compliance, advanced features (JSONB, full-text search), and strong community support. Alternatively, MongoDB (NoSQL) could be considered for projects requiring high flexibility in schema or massive scale with unstructured data.
  • Schema Design (Conceptual):

* Entity-Relationship Diagrams (ERDs): Will be created for core entities (e.g., Users, Products, Orders, Categories) to define relationships (one-to-one, one-to-many, many-to-many) and attributes.

* Normalization: Adherence to 3NF (Third Normal Form) to minimize data redundancy and improve data integrity. Denormalization will be selectively applied for performance optimization where read speed is critical.

* Indexing: Strategic use of indexes on frequently queried columns (primary keys, foreign keys, search fields) to optimize query performance.

  • Object-Relational Mapper (ORM): Sequelize.js (for Node.js with PostgreSQL). Provides an abstraction layer for database interactions, allowing developers to work with objects instead of raw SQL queries, improving development speed and maintainability.
  • Migration Strategy: Database migrations will be used to manage schema changes over time. Tools like Sequelize-CLI or Knex.js facilitate version control for database schemas, enabling smooth updates across environments.

5. Authentication & Authorization

Secure user access and role-based permissions are fundamental.

  • Authentication Strategy: JSON Web Tokens (JWT).

* Flow: User sends credentials to the backend. Backend authenticates, generates a JWT (access token) and a refresh token. Access token is short-lived and sent with subsequent requests in the Authorization header. Refresh token is used to obtain new access tokens when the current one expires.

* Storage: Access tokens are stored in memory or HttpOnly cookies (for CSRF protection). Refresh tokens are stored in HttpOnly cookies.

* Advantages: Statelessness, scalability, and broad client support.

  • User Management Flow:

* Registration: Email/password, password hashing (e.g., bcrypt). Email verification.

* Login: Credential validation, JWT generation.

* Password Reset: Secure token-based reset via email.

* Account Deactivation/Deletion.

  • Authorization: Role-Based Access Control (RBAC).

* Roles: Users are assigned roles (e.g., Admin, Manager, User, Guest).

* Permissions: Each role has specific permissions (e.g., create_product, read_user, delete_order).

* Implementation: Middleware on the backend will check the user's role/permissions against the required permissions for a given route or action.

  • OAuth2/OpenID Connect (Optional): Integration with third-party providers (Google, Facebook) for social login, using libraries like Passport.js.
  • Security Best Practices:

* HTTPS Everywhere.

* Input sanitization to prevent XSS and SQL injection.

* Rate limiting for authentication endpoints.

* CSRF protection (if using session cookies).

* Secure configuration for JWT secrets.


6. Deployment Configuration

Automated and scalable deployment is key for continuous delivery.

  • Infrastructure Provider: AWS (Amazon Web Services). Chosen for its comprehensive suite of services, scalability, and global reach. Alternatives include Google Cloud Platform (GCP) or Microsoft Azure.
  • Containerization: Docker.

* Each service (frontend, backend, database) will be containerized, ensuring consistent environments from development to production.

* docker-compose will be used for local development orchestration.

  • Orchestration (for scalability): AWS Elastic Container Service (ECS) or Kubernetes (EKS) for larger-scale, highly available deployments. ECS offers simpler management for Docker containers, while EKS provides the full power of Kubernetes.
  • Frontend Hosting:

* Static assets (React build output) will be hosted on AWS S3 and served via AWS CloudFront (CDN) for low-latency global delivery.

  • Backend Hosting:

* Docker containers will be deployed to AWS Fargate (serverless compute for containers) within ECS, managed by an Application Load Balancer (ALB) for traffic distribution.

  • Database Hosting:

* AWS RDS (Relational Database Service) for PostgreSQL, providing managed database services with automated backups, scaling, and high availability.

  • CI/CD Pipeline: GitHub Actions (or GitLab CI/CD, Jenkins).

* Stages:

1. Code Commit: Trigger on push to main/develop branches.

2. Linting & Testing: Run unit, integration, and E2E tests.

3. Build: Create Docker images for frontend and backend.

4. Push: Push Docker images to AWS ECR (Elastic Container Registry).

5. Deploy: Update ECS services to pull new images and deploy.

* Environments: Separate pipelines/configurations for development, staging, and production environments.

  • Monitoring & Logging:

* Logging: Centralized logging using AWS CloudWatch Logs. Backend will use a logging library (e.g., Winston) to output structured logs.

* Monitoring: AWS CloudWatch for metrics (CPU, memory, network, database performance) and custom dashboards. Prometheus/Grafana for more advanced metrics and visualization (if Kubernetes is used).

* Error Tracking: Sentry.io or similar for real-time error reporting and alerting.


7. Test Suites Strategy

A comprehensive testing strategy ensures code quality, stability, and reduces regressions.

  • Unit Tests:

* Purpose: Verify individual functions, components, or modules in isolation.

* Frontend Tools: Jest and React Testing Library (for React components).

* Backend Tools: Jest or Mocha/Chai.

* Coverage: Aim for high coverage (e.g., 80-90%) for core logic.

  • Integration Tests:

* Purpose: Verify interactions between different modules or services (e.g., API endpoint interacting with a service layer and database).

* Backend Tools: Supertest (for Express APIs) with Jest/Mocha.

* Frontend Tools: Testing interactions between multiple components or with a mocked API.

  • End-to-End (E2E) Tests:

* Purpose: Simulate real user scenarios across the entire application stack (browser to database).

* Tools: Cypress (for web applications) or Playwright.

* Scope: Critical user flows (e.g., user registration, login, product purchase).

  • Performance Tests (Brief Mention):

* Purpose: Evaluate application responsiveness, stability, and scalability under various load conditions.

* Tools (Optional): JMeter, K6, Locust.

* Focus: Identifying bottlenecks and ensuring acceptable response times.

  • Code Quality & Linting:

* ESLint (JavaScript/TypeScript) and Prettier for enforcing coding standards and formatting.

* Integrated into the CI/CD pipeline to fail builds on linting errors.


8. Technology Stack Recommendation (Summary)

  • Frontend: React.js, Redux Toolkit, React Router DOM, Tailwind CSS, Vite
  • Backend: Node.js, Express.js, Joi, Sequelize.js
  • Database: PostgreSQL
  • Authentication: JWT, Bcrypt
  • Deployment: AWS (S3, CloudFront, ECS Fargate, RDS, ECR, CloudWatch), Docker, GitHub Actions
  • Testing: Jest, React Testing Library, Supertest, Cypress
  • Code Quality: ESLint, Prettier

9. Scalability & Performance Considerations

  • Stateless Backend: Enables easy horizontal scaling of API instances.
  • Caching:

* Redis/Memcached: For frequently accessed data, session storage, or rate limiting.

* CDN (CloudFront): Caching static frontend assets globally.

  • Database Optimization:

* Proper indexing, query optimization, connection pooling.

* Read replicas for read-heavy workloads (AWS RDS).

  • Load Balancing: AWS ALB distributes traffic efficiently across backend instances.
  • Asynchronous Processing: Use message queues (e.g., AWS SQS, RabbitMQ) for long-running tasks (e.g., email sending, image processing) to avoid blocking main API threads.
  • Microservices (Future Consideration): For very large applications, breaking down the backend into smaller, independently deployable microservices.

10. Security Considerations

  • Input Validation: Strict validation on all user inputs to prevent
gemini Output

Full Stack Application Blueprint: Comprehensive Deliverable

This document provides a detailed, professional blueprint for a full-stack application, encompassing frontend components, backend API, database design, authentication, deployment configuration, and test suites. This blueprint is designed to be immediately actionable, guiding your development team through the initial setup and architectural decisions, and providing production-ready code examples.


1. Executive Summary

This blueprint outlines the architecture and core components for a modern, scalable, and secure full-stack application. We will leverage a robust and widely adopted technology stack to ensure maintainability, performance, and developer efficiency. The goal is to provide a clear roadmap for development, minimizing initial setup friction and establishing best practices from the outset.

Key Features:

  • Modular Architecture: Clear separation of concerns for frontend, backend, and database layers.
  • Scalability: Designed with practices that support future growth and increased load.
  • Security: Incorporates standard authentication mechanisms and secure coding practices.
  • Maintainability: Utilizes TypeScript for type safety, clear code structure, and comprehensive testing.
  • Developer Experience: Focus on tools and patterns that enhance productivity.

2. Technology Stack Overview

To provide a concrete and actionable blueprint, we've selected a popular and robust technology stack:

  • Frontend Framework: React with TypeScript

* Reasoning: React is a leading JavaScript library for building user interfaces, known for its component-based architecture, large ecosystem, and strong community support. TypeScript enhances code quality and maintainability through static typing.

  • Backend Framework: Node.js (Express) with TypeScript

* Reasoning: Node.js provides a high-performance, non-blocking I/O runtime environment, making it excellent for scalable APIs. Express.js is a minimalist, flexible Node.js web application framework. TypeScript again provides type safety and better tooling.

  • Database: PostgreSQL

* Reasoning: PostgreSQL is a powerful, open-source relational database system known for its reliability, feature robustness, and performance. It's suitable for complex data relationships and ensures data integrity.

  • ORM (Object-Relational Mapper): TypeORM (for Node.js)

* Reasoning: TypeORM is a powerful ORM that supports ActiveRecord and DataMapper patterns, offering excellent integration with TypeScript and PostgreSQL, simplifying database interactions.

  • Authentication: JSON Web Tokens (JWT)

* Reasoning: JWTs provide a stateless authentication mechanism, ideal for RESTful APIs. They are self-contained and can be securely transmitted between parties.

  • Deployment & Infrastructure: Docker, AWS (ECS/EC2, RDS)

* Reasoning: Docker ensures consistent environments across development, staging, and production. AWS provides a comprehensive suite of cloud services for scalable and reliable infrastructure.

  • CI/CD: GitHub Actions

* Reasoning: GitHub Actions offers integrated, flexible, and powerful CI/CD capabilities directly within your repository.


3. Application Architecture

The application will follow a standard client-server architecture with a clear separation of concerns.


graph TD
    A[User] -->|Browser/Mobile| B(Frontend Application - React/TS)
    B -->|HTTP/REST API Calls| C(Backend API - Node.js/Express/TS)
    C -->|ORM Queries| D(Database - PostgreSQL)
    C -->|Authentication/Authorization| E(JWT Service)
    D --Optional--> F(Caching Layer - e.g., Redis)
    C --Optional--> G(Message Queue - e.g., RabbitMQ/SQS)
    H[Deployment Platform - AWS ECS/EC2] --> I(Docker Containers)
    I --> B
    I --> C
    J[CI/CD - GitHub Actions] --> H

Key Architectural Principles:

  • Stateless Backend: Enables easier scaling and resilience.
  • API-First Approach: The backend is designed as a robust API, consumable by various clients (web, mobile, third-party integrations).
  • Modularity: Each component (frontend, backend, database) can be developed, tested, and deployed independently.
  • Security by Design: Authentication and authorization are built into the core API layer.

4. Frontend Blueprint (React with TypeScript)

The frontend will be a Single Page Application (SPA) built with React and TypeScript, providing a rich and interactive user experience.

4.1. Project Structure


frontend/
├── public/
│   └── index.html
├── src/
│   ├── assets/               # Static assets (images, fonts)
│   ├── components/           # Reusable UI components (buttons, inputs, cards)
│   │   ├── Button/
│   │   │   ├── Button.tsx
│   │   │   └── Button.module.scss
│   │   └── Layout/
│   │       ├── Header.tsx
│   │       └── Footer.tsx
│   ├── hooks/                # Custom React hooks
│   │   └── useAuth.ts
│   ├── pages/                # Top-level components mapped to routes
│   │   ├── Auth/
│   │   │   ├── LoginPage.tsx
│   │   │   └── RegisterPage.tsx
│   │   ├── DashboardPage.tsx
│   │   └── HomePage.tsx
│   ├── services/             # API client services
│   │   ├── authService.ts
│   │   └── api.ts            # Axios instance
│   ├── store/                # State management (e.g., Redux, Zustand, React Context)
│   │   ├── authSlice.ts
│   │   └── index.ts
│   ├── types/                # TypeScript interfaces and types
│   │   ├── auth.ts
│   │   └── user.ts
│   ├── utils/                # Utility functions (formatters, validators)
│   │   └── constants.ts
│   ├── App.tsx               # Main application component
│   ├── index.tsx             # Entry point
│   └── react-app-env.d.ts    # TypeScript environment declarations
├── .env                      # Environment variables
├── tsconfig.json             # TypeScript configuration
├── package.json
└── README.md

4.2. Example Frontend Component: AuthForm

This example demonstrates a basic login form component, including state management, input handling, and API interaction.


// frontend/src/components/Auth/AuthForm.tsx
import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { loginUser, registerUser } from '../../services/authService';
import { UserCredentials } from '../../types/auth'; // Define this type in types/auth.ts
import styles from './AuthForm.module.scss'; // Using CSS Modules for styling

interface AuthFormProps {
  type: 'login' | 'register';
  onSuccess?: () => void;
}

const AuthForm: React.FC<AuthFormProps> = ({ type, onSuccess }) => {
  const [email, setEmail] = useState<string>('');
  const [password, setPassword] = useState<string>('');
  const [loading, setLoading] = useState<boolean>(false);
  const [error, setError] = useState<string | null>(null);
  const navigate = useNavigate();

  const handleSubmit = async (event: React.FormEvent) => {
    event.preventDefault();
    setLoading(true);
    setError(null);

    const credentials: UserCredentials = { email, password };

    try {
      if (type === 'login') {
        await loginUser(credentials);
        console.log('Login successful!');
      } else {
        await registerUser(credentials);
        console.log('Registration successful!');
      }
      onSuccess?.(); // Callback for successful authentication
      navigate('/dashboard'); // Redirect to dashboard on success
    } catch (err: any) {
      setError(err.response?.data?.message || 'An unexpected error occurred.');
      console.error('Authentication error:', err);
    } finally {
      setLoading(false);
    }
  };

  return (
    <form className={styles.authForm} onSubmit={handleSubmit}>
      <h2>{type === 'login' ? 'Login' : 'Register'}</h2>
      {error && <p className={styles.error}>{error}</p>}
      <div className={styles.formGroup}>
        <label htmlFor="email">Email:</label>
        <input
          type="email"
          id="email"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
          required
          aria-label="Email address"
        />
      </div>
      <div className={styles.formGroup}>
        <label htmlFor="password">Password:</label>
        <input
          type="password"
          id="password"
          value={password}
          onChange={(e) => setPassword(e.target.value)}
          required
          aria-label="Password"
        />
      </div>
      <button type="submit" disabled={loading} className={styles.submitButton}>
        {loading ? 'Processing...' : (type === 'login' ? 'Log In' : 'Register')}
      </button>
    </form>
  );
};

export default AuthForm;

// frontend/src/types/auth.ts
export interface UserCredentials {
  email: string;
  password: string;
}

export interface AuthResponse {
  token: string;
  user: {
    id: string;
    email: string;
    // Add other user properties as needed
  };
}

// frontend/src/services/api.ts
import axios from 'axios';

// Create an Axios instance with a base URL and default headers
const api = axios.create({
  baseURL: process.env.REACT_APP_API_BASE_URL || 'http://localhost:5000/api', // Use environment variable
  headers: {
    'Content-Type': 'application/json',
  },
});

// Request interceptor to attach JWT token to outgoing requests
api.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('jwt_token'); // Retrieve token from localStorage
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// Response interceptor to handle global errors (e.g., 401 Unauthorized)
api.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response && error.response.status === 401) {
      // Handle unauthorized errors, e.g., redirect to login page
      console.warn('Unauthorized access. Redirecting to login...');
      localStorage.removeItem('jwt_token'); // Clear invalid token
      // window.location.href = '/login'; // Example: redirect
    }
    return Promise.reject(error);
  }
);

export default api;

// frontend/src/services/authService.ts
import api from './api';
import { UserCredentials, AuthResponse } from '../types/auth';

export const loginUser = async (credentials: UserCredentials): Promise<AuthResponse> => {
  try {
    const response = await api.post<AuthResponse>('/auth/login', credentials);
    // Store the JWT token upon successful login
    localStorage.setItem('jwt_token', response.data.token);
    // Optionally store user info
    localStorage.setItem('user_info', JSON.stringify(response.data.user));
    return response.data;
  } catch (error) {
    console.error('Login failed:', error);
    throw error; // Re-throw to be handled by the component
  }
};

export const registerUser = async (credentials: UserCredentials): Promise<AuthResponse> => {
  try {
    const response = await api.post<AuthResponse>('/auth/register', credentials);
    // Store the JWT token upon successful registration
    localStorage.setItem('jwt_token', response.data.token);
    localStorage.setItem('user_info', JSON.stringify(response.data.user));
    return response.data;
  } catch (error) {
    console.error('Registration failed:', error);
    throw error;
  }
};

export const logoutUser = () => {
  localStorage.removeItem('jwt_token');
  localStorage.removeItem('user_info');
  // Optionally, clear any global state related to authentication
};

export const getCurrentUser = () => {
  const userInfo = localStorage.getItem('user_info');
  return userInfo ? JSON.parse(userInfo) : null;
};

4.3. State Management

For complex applications, consider using a dedicated state management library:

  • Zustand / Jotai: Lightweight and performant, ideal for smaller to medium-sized projects or specific global states.
  • React Query / SWR: Excellent for managing server-side data fetching, caching, and synchronization. Often used in conjunction with a lightweight state manager for UI state.
  • Redux Toolkit: Comprehensive solution for larger applications requiring strict state management patterns, developer tools, and middleware capabilities.

4.4. Routing

React Router DOM will be used for client-side routing.


// frontend/src/App.tsx
import React from 'react';
import { BrowserRouter as Router,
full_stack_app_blueprint.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);}});}