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

This blueprint outlines a robust, scalable, and maintainable full-stack application using modern technologies. It provides a detailed architecture, core components, and production-ready code examples for the frontend, backend, database, authentication, deployment, and testing.


Full Stack App Blueprint: Comprehensive Design

This blueprint describes a full-stack application leveraging React with TypeScript for the frontend, Node.js (Express) with TypeScript for the backend, and PostgreSQL as the primary database. Authentication will be managed using JWT (JSON Web Tokens), and deployment will be orchestrated with Docker and Docker Compose.

1. Overall Architecture

The application follows a client-server architecture, with the frontend consuming APIs exposed by the backend.

text • 414 chars
#### 2.2. Key Technologies & Dependencies

*   **React**: UI library
*   **TypeScript**: Type safety
*   **React Router DOM**: Client-side routing
*   **Axios**: HTTP client for API requests
*   **Context API**: Simple global state management (for auth)
*   **CSS Modules/Styled Components**: For styling (CSS Modules chosen for this example)

#### 2.3. Example Code Snippets

**`my-app-frontend/tsconfig.json`**
Sandboxed live preview

Full Stack Application Blueprint: Architecture Plan

Project Name: [Placeholder - e.g., "PantheraConnect Social Platform" or "EcoSense IoT Dashboard"]

Date: October 26, 2023

Version: 1.0

Status: Approved for Development Planning


1. Executive Summary

This document outlines the comprehensive architectural plan for the full-stack application. It details the chosen technologies, structural components, and design principles for the frontend, backend API, database, authentication, deployment, and testing strategies. The aim is to establish a robust, scalable, secure, and maintainable foundation that facilitates efficient development and future growth, ensuring a ready-to-build blueprint for the development team.


2. Application Overview

The application is envisioned as a [brief description of application purpose, e.g., "interactive social networking platform facilitating user connections, content sharing, and real-time communication" or "data-driven dashboard for monitoring and managing IoT devices across various locations"]. It will provide a rich user experience via a modern web interface, powered by a secure and scalable backend API.

Key High-Level Features:

  • User Management: Registration, Login, Profile Management, Password Reset.
  • Core Feature A: [e.g., Post creation, commenting, liking]
  • Core Feature B: [e.g., Real-time notifications, direct messaging]
  • Core Feature C: [e.g., Data visualization, device control]
  • Administrative Panel: User and content moderation, system health monitoring.

3. Architectural Style

Chosen Style: Micro-frontend (optional, for larger apps) + Monolithic Backend (Modular) with RESTful API.

  • Frontend: A single-page application (SPA) leveraging a modern JavaScript framework, structured into modular components. For larger applications, a Micro-frontend approach can be considered for independent teams and deployments.
  • Backend: A well-structured, modular monolith initially, allowing for easier development and deployment. Services within the monolith will be logically separated to facilitate potential future transition to microservices if scalability demands it.
  • Communication: Primarily RESTful API for synchronous data exchange between frontend and backend. Asynchronous communication (e.g., WebSockets) will be integrated for real-time features.

Rationale: This approach offers a balance of rapid development, maintainability, and scalability. A modular monolith simplifies initial deployment and operations while providing clear separation of concerns, and a modern SPA ensures a responsive user experience.


4. Frontend Architecture

The frontend will be a Single Page Application (SPA) designed for responsiveness, performance, and maintainability.

  • Framework/Library: React.js

* Rationale: Large community support, rich ecosystem, component-based architecture, strong performance, and excellent tooling.

  • Component Structure:

* Atomic Design Principles: Organizing components into Atoms (buttons, inputs), Molecules (forms, navigation bars), Organisms (headers, footers), Templates (page layouts), and Pages (actual views).

* Feature-based Grouping: Components related to specific features (e.g., src/features/Auth, src/features/Posts) will be co-located.

* Reusable Components: A dedicated src/components directory for generic, reusable UI elements.

  • State Management: React Query for server state management (data fetching, caching, synchronization) and Zustand/Jotai for local/global client-side state.

* Rationale: React Query simplifies data fetching and caching, reducing boilerplate. Zustand/Jotai offers a lightweight and performant solution for local state, avoiding over-engineering with larger libraries like Redux for simpler state needs.

  • Routing: React Router DOM

* Rationale: Standard library for declarative routing in React applications.

  • Styling: Tailwind CSS with PostCSS

* Rationale: Utility-first CSS framework for rapid UI development, consistent design, and smaller CSS bundles. PostCSS for processing and optimizing CSS.

  • Build Process: Vite

* Rationale: Next-generation frontend tooling for extremely fast development server and optimized build processes.

  • Key Libraries/Tools:

* Form Handling: React Hook Form (with Zod for schema validation).

* UI Components: Headless UI (for accessible, unstyled UI components) or a chosen component library (e.g., Chakra UI, Ant Design, Material UI) if a pre-styled solution is preferred.

* Internationalization (i18n): react-i18next.

* Testing: Jest, React Testing Library, Cypress (for E2E).

* Linting/Formatting: ESLint, Prettier.


5. Backend Architecture

The backend will serve as a robust and secure API layer, handling business logic, data persistence, and external integrations.

  • Framework/Language: NestJS (Node.js/TypeScript)

* Rationale: Progressive Node.js framework for building efficient, reliable, and scalable server-side applications. Leverages TypeScript, provides an opinionated structure (modules, controllers, services, providers), and follows an architecture inspired by Angular, promoting maintainability and testability.

  • API Design Principles: RESTful API

* Endpoints: Resource-based URLs (e.g., /api/users, /api/posts/{id}).

* HTTP Methods: Adherence to standard methods (GET, POST, PUT, PATCH, DELETE).

* Statelessness: Each request from client to server must contain all necessary information.

* Data Format: JSON for request and response bodies.

* Versioning: API versioning (e.g., /api/v1/users) for future compatibility.

  • Service Structure (Modular Monolith):

* Modules: Application divided into feature-based modules (e.g., AuthModule, UserModule, PostModule, NotificationModule).

* Controllers: Handle incoming requests, validate input, and delegate to services.

* Services: Contain core business logic, interact with the database (via repositories), and orchestrate complex operations.

* Providers: Injectable classes (services, repositories, factories) for dependency injection.

* DTOs (Data Transfer Objects): Used for strict request/response payload validation.

  • Database Integration: TypeORM (Object-Relational Mapper)

* Rationale: Provides an elegant way to interact with SQL databases using TypeScript/JavaScript objects, abstracting SQL queries and simplifying schema migrations.

  • Error Handling: Centralized error handling middleware/interceptors to catch and format API errors consistently (e.g., 404 Not Found, 400 Bad Request, 500 Internal Server Error).
  • Logging & Monitoring:

* Logging: Winston or Pino for structured logging, integrated with a log management service (e.g., AWS CloudWatch Logs, ELK Stack).

* Monitoring: Prometheus & Grafana for application metrics (request rates, error rates, latency) and system health.

  • Key Libraries/Tools:

* Validation: Class-validator (integrated with NestJS).

* Authentication: Passport.js (JWT strategy).

* Environment Variables: dotenv.

* Testing: Jest, Supertest.

* API Documentation: Swagger/OpenAPI (integrated with NestJS for automated generation).


6. Database Design

A relational database is chosen for its data integrity, transactional capabilities, and structured nature.

  • Database Type: PostgreSQL

* Rationale: Robust, open-source, object-relational database known for its reliability, feature richness, and extensibility. Excellent support for complex queries and transactional workloads.

  • Schema Design (Conceptual):

* Users Table: id (PK), username (UNIQUE), email (UNIQUE), password_hash, first_name, last_name, profile_picture_url, created_at, updated_at, is_active, role_id (FK).

* Roles Table: id (PK), name (UNIQUE, e.g., 'admin', 'user').

* Posts Table: id (PK), user_id (FK), content, image_url, created_at, updated_at.

* Comments Table: id (PK), post_id (FK), user_id (FK), content, created_at.

* Likes Table: id (PK), post_id (FK), user_id (FK), created_at (composite unique key on post_id, user_id).

* Notifications Table: id (PK), user_id (FK), type, message, is_read, created_at.

* Relationships:

* One-to-Many: User to Posts, User to Comments, User to Likes, User to Notifications.

* Many-to-Many: (e.g., for followers/following, if applicable, via a join table like UserFollows).

  • Migration Strategy: TypeORM Migrations

* Process: Database schema changes will be managed through version-controlled migration files. These files will define up (to apply changes) and down (to revert changes) methods.

* Automation: Migrations will be run automatically during deployment or as part of a CI/CD pipeline step.


7. Authentication & Authorization

Securing the application is paramount, controlling who can access the system and what actions they can perform.

  • Authentication Method: JSON Web Tokens (JWT)

* Flow:

1. Registration: User signs up with email/username and password. Password is hashed and stored.

2. Login: User sends credentials to the backend. If valid, backend generates an access_token (short-lived) and a refresh_token (long-lived).

3. access_token is sent back to the client and stored (e.g., in localStorage or HttpOnly cookie).

4. refresh_token is stored securely (e.g., HttpOnly cookie or secure storage).

5. For subsequent requests, the client sends the access_token in the Authorization: Bearer <token> header.

6. Backend validates the access_token. If expired but valid, refresh_token is used to obtain a new access_token without re-login.

* Security: Tokens are signed using a strong secret. HTTPS is mandatory for all communication.

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

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

* Permissions: Each role is associated with specific permissions (e.g., create:post, read:user, delete:comment).

* Implementation: Backend middleware/guards will check the user's role and associated permissions before allowing access to specific API endpoints or actions.


8. Deployment Strategy

The application will be deployed to a cloud provider, leveraging modern DevOps practices for automation and scalability.

  • Cloud Provider: AWS (Amazon Web Services)

* Rationale: Industry-leading cloud platform offering a comprehensive suite of services for compute, database, storage, and networking, providing flexibility and scalability.

  • Containerization: Docker

* Process: Frontend and Backend applications will be containerized using Docker. Each service will have its own Dockerfile.

* Benefits: Ensures environment consistency from development to production, simplifies deployment, and enhances portability.

  • Orchestration: AWS Elastic Container Service (ECS) or AWS Fargate

* Rationale: Managed container orchestration service for running Docker containers. Fargate offers a serverless compute engine, abstracting server management.

* Components:

* ECS Cluster: Logical grouping of tasks.

* Task Definitions: Define Docker images, CPU/memory, environment variables, and networking for containers.

* Services: Maintain desired number of tasks, handle load balancing and auto-scaling.

  • Database Service: AWS RDS (Relational Database Service) for PostgreSQL

* Rationale: Managed database service, handling provisioning, patching, backup, and scaling of the PostgreSQL instance.

  • Static Assets/Frontend Hosting: AWS S3 + CloudFront

* Process: Frontend build artifacts will be uploaded to an S3 bucket configured for static website hosting. CloudFront will serve as a Content Delivery Network (CDN) for caching and faster global delivery.

gemini Output

Full Stack Application Blueprint: SynergyHub - A Collaborative Task Management Platform

This document presents a comprehensive, detailed, and professional blueprint for a full-stack application, ready to guide the development of "SynergyHub" – a collaborative task management and project coordination platform. This blueprint covers all essential aspects from frontend components and backend APIs to database design, authentication, deployment strategies, and testing suites.


1. Application Overview: SynergyHub

SynergyHub is envisioned as a modern, intuitive, and robust platform designed to empower teams to manage projects, track tasks, and foster seamless collaboration. It will provide a centralized hub for creating projects, assigning tasks, setting deadlines, and communicating progress.

Core Features:

  • User Management: Registration, login, profile management, role-based access.
  • Project Management: Create, view, edit, delete projects; define project teams.
  • Task Management: Create, assign, track, update tasks; set priorities and due dates.
  • Collaboration: Commenting on tasks, activity feeds.
  • Dashboard: Personalized overview of assigned tasks and project progress.
  • Notifications: Real-time updates on task assignments, comments, and deadlines.

2. Technology Stack Recommendation

A modern, scalable, and maintainable technology stack is crucial for SynergyHub.

  • Frontend:

* Framework: React.js (with Create React App/Vite)

* Language: TypeScript

* Styling: Tailwind CSS (for utility-first styling) + Headless UI (for accessible components)

* State Management: React Query (for server state) + Zustand (for client state)

  • Backend:

* Framework: Node.js with NestJS (for opinionated, scalable architecture)

* Language: TypeScript

* API Style: RESTful API

  • Database:

* Primary: PostgreSQL (for relational data integrity and robust features)

* ORM: TypeORM (seamless integration with NestJS and TypeScript)

* Caching/Session Store: Redis (for performance optimization and session management)

  • Authentication:

* JSON Web Tokens (JWT) with Refresh Tokens

* OAuth 2.0 (for optional social logins like Google, GitHub)

  • Deployment & Infrastructure:

* Containerization: Docker, Docker Compose

* Orchestration: Kubernetes (K8s)

* Cloud Provider: AWS (Amazon Web Services)

* CI/CD: GitHub Actions

  • Testing:

* Unit/Integration: Jest, React Testing Library (Frontend), Jest (Backend)

* End-to-End (E2E): Playwright

  • Monitoring & Logging:

* Prometheus & Grafana

* ELK Stack (Elasticsearch, Logstash, Kibana)


3. Frontend Blueprint (React.js with TypeScript & Tailwind CSS)

The frontend will be built as a Single Page Application (SPA) focusing on performance, responsiveness, and an intuitive user experience.

3.1. Architecture

  • Component-Based: Modular and reusable UI components.
  • Atomic Design Principles: Organizing components into Atoms, Molecules, Organisms, Templates, and Pages.
  • Folder Structure: Organized by feature (e.g., src/features/auth, src/features/projects, src/components/common).
  • State Management:

* Server State: React Query for data fetching, caching, synchronization, and error handling.

* Client State: Zustand for global UI state (e.g., theme, modal visibility).

  • Routing: React Router DOM for navigation.

3.2. Core Components

  • Layout Components:

* AppLayout: Main application layout with Header, Sidebar, and Content area.

* AuthLayout: Layout for login/registration pages.

  • Navigation:

* Header: Logo, user avatar/menu, search bar, notifications.

* Sidebar: Main navigation links (Dashboard, Projects, Tasks, Teams, Settings).

  • Authentication:

* LoginForm: User login with email/password.

* RegisterForm: New user registration.

* ForgotPasswordForm, ResetPasswordForm.

  • Dashboard:

* WelcomeWidget: Personalized greeting.

* MyTasksWidget: List of assigned tasks.

* ProjectOverviewWidget: Summary of active projects.

* ActivityFeedWidget: Recent project/task activities.

  • Project Management:

* ProjectList: Display all projects.

* ProjectCard: Individual project summary.

* ProjectDetails: View project information, tasks, members.

* ProjectForm: Create/edit project.

  • Task Management:

* TaskList: Display tasks within a project or assigned to a user.

* TaskCard: Individual task summary.

* TaskDetailsModal: Detailed view of a task with comments, attachments.

* TaskForm: Create/edit task.

  • User & Team Management:

* UserProfile: User profile viewing and editing.

* TeamMembersList: List of project team members.

* UserAvatar, UserBadge.

  • Common UI Elements:

* Button, Input, Dropdown, Modal, Spinner, ToastNotification, ProgressBar.

3.3. API Integration

  • HTTP Client: Axios for making API requests.
  • Error Handling: Centralized error handling using Axios interceptors and React Query's error boundaries.
  • Data Fetching: Utilize React Query for efficient data fetching, caching, and background re-fetching.

3.4. Accessibility and Responsiveness

  • Accessibility (A11y): Adherence to WCAG guidelines, use of semantic HTML, ARIA attributes where necessary, keyboard navigation support (Headless UI helps significantly here).
  • Responsiveness: Mobile-first design approach using Tailwind CSS utility classes and breakpoints.

4. Backend API Blueprint (Node.js with NestJS & TypeScript)

The backend will be a robust, scalable RESTful API built with NestJS, leveraging its modular structure, dependency injection, and TypeScript support.

4.1. Architecture

  • Modular Design: Organized into modules based on features (e.g., AuthModule, UsersModule, ProjectsModule, TasksModule).
  • Layered Architecture:

* Controllers: Handle incoming requests, validate input, delegate to services.

* Services: Contain business logic, interact with repositories.

* Repositories: Interact directly with the database via TypeORM.

* DTOs (Data Transfer Objects): Define request and response payload structures for validation and clarity.

  • API Versioning: /api/v1/...
  • Error Handling: Global exception filters for consistent error responses.

4.2. API Endpoints (Examples)

  • Authentication (/api/v1/auth)

* POST /register: Register a new user.

* POST /login: Authenticate user, return JWT and refresh token.

* POST /refresh: Refresh access token using refresh token.

* POST /logout: Invalidate refresh token.

* POST /forgot-password: Initiate password reset.

* POST /reset-password: Reset password with token.

  • Users (/api/v1/users)

* GET /: Get all users (Admin only).

* GET /:id: Get user by ID.

* GET /me: Get current authenticated user's profile.

* PUT /me: Update current user's profile.

* DELETE /:id: Delete user (Admin only).

  • Projects (/api/v1/projects)

* GET /: Get all projects (filtered by user access).

* GET /:id: Get project details.

* POST /: Create a new project.

* PUT /:id: Update project details.

* DELETE /:id: Delete a project.

* POST /:id/members: Add member to project.

* DELETE /:id/members/:userId: Remove member from project.

  • Tasks (/api/v1/tasks or /api/v1/projects/:projectId/tasks)

* GET /: Get all tasks (filtered by user/project).

* GET /:id: Get task details.

* POST /: Create a new task.

* PUT /:id: Update task details.

* DELETE /:id: Delete a task.

* POST /:id/comments: Add a comment to a task.

* GET /:id/comments: Get all comments for a task.

  • Notifications (/api/v1/notifications)

* GET /: Get user's notifications.

* PUT /:id/read: Mark notification as read.

4.3. Data Validation

  • Validation Pipes: NestJS ValidationPipe with class-validator and class-transformer for automatic request payload validation using DTOs.

4.4. Security

  • CORS: Configured to allow requests only from the frontend domain.
  • Rate Limiting: Protect against brute-force attacks on login and registration.
  • Input Sanitization: Prevent XSS and SQL injection (TypeORM helps with this by default).
  • Helmet: Middleware for setting various HTTP headers to improve security.
  • Password Hashing: Use bcrypt for secure password storage.
  • JWT Security: Store refresh tokens securely (e.g., in HttpOnly cookies) and use short-lived access tokens.

5. Database Design (PostgreSQL with TypeORM)

A well-structured relational database schema is critical for data integrity and efficient querying.

5.1. Entity Relationship Diagram (Conceptual)

  • Users: Manages user accounts and profiles.
  • Projects: Manages project details and ownership.
  • ProjectMembers: Junction table for many-to-many relationship between Users and Projects.
  • Tasks: Manages individual tasks, linked to projects and assigned users.
  • Comments: Stores comments related to tasks.
  • Notifications: Stores user notifications.

5.2. Schema Definition (Logical - Example Tables)

  • users Table:

* id (UUID, PK)

* username (VARCHAR(50), UNIQUE, NOT NULL)

* email (VARCHAR(255), UNIQUE, NOT NULL)

* password_hash

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