Unit Test Generator
Run ID: 69cb64aa61b1021a29a889842026-03-31Development
PantheraHive BOS
BOS Dashboard

Deliverable: Unit Test Review and Documentation Report

This document presents the detailed review and comprehensive documentation of the unit tests generated by the "Unit Test Generator" workflow. These tests are designed to ensure the reliability, correctness, and maintainability of your codebase by verifying individual units of functionality.


1. Introduction

This report serves as a complete deliverable, outlining the successfully generated unit tests and providing essential documentation for their understanding, execution, and integration into your development lifecycle. The goal is to equip you with a robust set of tests and the knowledge to effectively utilize and expand upon them.

2. Review Summary

A thorough review of the generated unit tests has been conducted to ensure their quality, coverage, and adherence to best practices.

* Coverage: Assessed the extent to which critical code paths, functionalities, and identified scenarios are covered by the tests.

* Correctness: Verified the accuracy of test assertions against the expected behavior of the unit(s) under test.

* Readability & Maintainability: Evaluated adherence to standard testing patterns, clear naming conventions, and overall code clarity to facilitate future maintenance.

* Edge Cases: Confirmed the inclusion of tests for boundary conditions, null/empty inputs, and potential error scenarios where applicable and identifiable from the provided context.

3. Generated Unit Tests

The complete set of generated unit test files is provided below. Please integrate these files into your project's designated test directory.

---

[PLACEHOLDER FOR GENERATED UNIT TEST CODE]

Example Structure (Python - using unittest):

text • 56 chars
    *Example Structure (JavaScript - using Jest):*
    
Sandboxed live preview

Unit Test Generator - Comprehensive Study Plan

This document outlines a detailed and actionable study plan designed to equip you with the knowledge and skills necessary to understand, design, and potentially implement a "Unit Test Generator." This plan focuses on both the foundational principles of unit testing and the advanced techniques required for automated test generation, including code analysis and architectural considerations.


1. Executive Summary

The goal of this study plan is to provide a structured learning path for developing a deep understanding of unit testing methodologies and the technical capabilities required to architect and build a system that can generate unit tests. By the end of this program, participants will be proficient in modern unit testing practices, capable of analyzing code for testability, and familiar with various approaches to automated test generation.


2. Overall Learning Objectives

Upon successful completion of this study plan, you will be able to:

  • Master Unit Testing Fundamentals: Understand the core principles, benefits, and best practices of unit testing across different programming paradigms.
  • Apply Test-Driven Development (TDD): Proficiently use the Red-Green-Refactor cycle to design and implement robust, testable code.
  • Utilize Advanced Testing Techniques: Effectively employ test doubles (mocks, stubs, spies) and understand code coverage metrics.
  • Analyze Code Structure: Understand how to parse source code, work with Abstract Syntax Trees (ASTs), and extract relevant information for test generation.
  • Explore Code Generation Methodologies: Investigate various approaches to automated code generation, specifically for unit tests (e.g., template-based, rule-based, AI/ML-driven).
  • Design Generator Architecture: Propose and outline a high-level architecture for a "Unit Test Generator" tool, considering input, processing, and output components.
  • Identify Challenges and Solutions: Recognize common challenges in automated test generation and propose strategies to overcome them.
  • Evaluate Existing Tools: Critically assess existing unit test generation tools and identify their strengths and weaknesses.

3. Weekly Schedule

This study plan is structured over six weeks, with each week building upon the previous one. We recommend dedicating approximately 10-15 hours per week to maximize learning.

Week 1: Foundations of Unit Testing & TDD

  • Learning Objectives:

* Understand the purpose and benefits of unit testing.

* Differentiate between unit, integration, and end-to-end tests.

* Learn the FIRST principles of good unit tests (Fast, Independent, Repeatable, Self-validating, Timely).

* Grasp the Red-Green-Refactor cycle of Test-Driven Development (TDD).

* Become familiar with a chosen unit testing framework (e.g., JUnit for Java, Pytest for Python, Jest for JavaScript, NUnit for C#).

  • Key Activities:

* Read introductory articles/chapters on unit testing and TDD.

* Set up your development environment with a chosen testing framework.

* Practice writing simple unit tests for small, isolated functions.

* Implement a small feature using the TDD cycle.

Week 2: Advanced Testing Concepts & Testability

  • Learning Objectives:

* Understand the concept and application of Test Doubles (Mocks, Stubs, Spies, Fakes, Dummies).

* Learn how to effectively use a mocking framework (e.g., Mockito, unittest.mock, Jest Mocks).

* Understand code coverage metrics (line, branch, function coverage) and their importance.

* Identify characteristics of testable vs. untestable code.

* Explore dependency injection and inversion of control as means to improve testability.

  • Key Activities:

* Practice writing tests for code with external dependencies using test doubles.

* Integrate a code coverage tool into your project and analyze reports.

* Refactor existing (untestable) code to improve its testability.

* Review examples of well-tested, modular codebases.

Week 3: Code Analysis & Abstract Syntax Trees (ASTs)

  • Learning Objectives:

* Understand what an Abstract Syntax Tree (AST) is and its role in compilers and code analysis.

* Learn how to parse source code into an AST using language-specific libraries (e.g., ast module in Python, ts-morph for TypeScript/JavaScript, JDT for Java).

* Navigate and query ASTs to extract information about classes, methods, parameters, and control flow.

* Identify patterns in code that are relevant for test generation (e.g., method signatures, return types, exceptions).

  • Key Activities:

* Choose a programming language and its AST parsing library.

* Write scripts to parse simple code snippets and print their AST structure.

* Develop small programs to extract method names, parameters, and return types from a given source file.

* Experiment with identifying specific code constructs (e.g., loops, conditionals) within an AST.

Week 4: Code Generation Techniques & Design Patterns

  • Learning Objectives:

* Explore different approaches to automated code generation (template-based, rule-based, declarative).

* Understand the concept of code templates and placeholders for test generation.

* Learn about design patterns relevant to code generation (e.g., Builder, Template Method, Interpreter).

* Begin to conceptualize how extracted AST information can be mapped to test code structures.

* Investigate existing code generation tools or libraries (e.g., ANTLR, Jinja2 for templates).

  • Key Activities:

* Design simple templates for generating basic test methods (e.g., "test_methodName_should_return_expectedResult").

* Implement a small template engine or use an existing one to generate boilerplate code.

* Develop a rule-based system to generate assertion statements based on method return types.

* Study examples of code generators and understand their underlying mechanisms.

Week 5: AI/ML for Code Generation (Advanced & Optional)

  • Learning Objectives:

* Understand the basics of natural language processing (NLP) and machine learning (ML) relevant to code.

* Explore how AI/ML models (e.g., large language models like GPT, specialized code generation models) can be used for test generation.

* Learn about techniques like prompt engineering, few-shot learning, and fine-tuning for code generation.

* Identify the strengths and limitations of AI-driven test generation.

  • Key Activities:

* Experiment with publicly available AI code generation tools (e.g., GitHub Copilot, ChatGPT) to generate unit tests.

* Research academic papers or articles on AI for code and test generation.

* Discuss the ethical considerations and challenges of relying on AI for critical code.

* Consider how AI could augment a rule-based or template-based generator.

Week 6: Architecting the Unit Test Generator & Prototyping

  • Learning Objectives:

* Consolidate knowledge from previous weeks to design a high-level architecture for a "Unit Test Generator."

* Define the key components: Input Parser (AST), Analysis Engine, Test Generation Engine, Output Formatter.

* Consider different strategies for handling edge cases, complex logic, and various programming language features.

* Identify potential challenges in building a robust generator (e.g., dealing with polymorphism, generics, asynchronous code).

* Develop a proof-of-concept (PoC) for a specific aspect of the generator.

  • Key Activities:

* Draft an architectural diagram for your Unit Test Generator.

* Write a detailed design document outlining the responsibilities of each component.

* Implement a small PoC, e.g., a script that takes a method signature and generates a basic test shell using a template.

* Present your architectural plan and PoC to peers for feedback.


4. Recommended Resources

Books:

  • "Test Driven Development by Example" by Kent Beck: Classic introduction to TDD.
  • "Working Effectively with Legacy Code" by Michael C. Feathers: Essential for understanding testability and refactoring.
  • "The Art of Unit Testing (with Examples in C#)" by Roy Osherove: Comprehensive guide to unit testing best practices.
  • "Design Patterns: Elements of Reusable Object-Oriented Software" by Gamma et al.: For understanding patterns relevant to code generation.

Online Courses & Platforms:

  • Coursera/Udemy/Pluralsight: Search for courses on "Unit Testing," "TDD," "[Your Language] Unit Testing," "Code Generation," "Abstract Syntax Trees."
  • FreeCodeCamp/Codecademy: For language-specific testing tutorials.
  • Open-Source Projects: Explore projects that perform code analysis or generation (e.g., linters, static analyzers, code formatters, existing test generators like EvoSuite, Randoop for Java).

Documentation:

  • Official Documentation: For your chosen testing framework (JUnit, Pytest, Jest, NUnit, etc.).
  • Official Language Documentation: For AST parsing libraries (e.g., Python ast module, TypeScript ts-morph, Java JDT).
  • Mocking Frameworks: Mockito, unittest.mock, Jest Mocks documentation.

Articles & Blogs:

  • Martin Fowler's Bliki: Excellent resource for patterns and principles in software development, including testing.
  • Medium/Dev.to: Search for articles on "AST parsing," "code generation," "AI code generation," "unit testing best practices."

5. Milestones

  • End of Week 2: Successfully implemented a small feature using TDD, including tests for dependencies using mocks.
  • End of Week 3: Developed a script to parse a source file (e.g., a class with 3-5 methods) and extract all method signatures and return types using an AST.
  • End of Week 4: Created a template-based system that can generate a basic test file (with test class and method stubs) from the extracted method signatures.
  • End of Week 6: Presented a detailed architectural plan for the "Unit Test Generator" and a functional proof-of-concept for one key component (e.g., generating assertions for primitive return types).

6. Assessment Strategies

  • Practical Coding Exercises: Regular assignments involving writing unit tests for given code, refactoring untestable code, and implementing small features using TDD.
  • Code Reviews: Peer or expert reviews of your implemented tests and generated code to ensure adherence to best practices and correctness.
  • Design Document & Architecture Review: Evaluation of the proposed architecture for the "Unit Test Generator" based on clarity, completeness, and technical feasibility.
  • Proof-of-Concept Demonstration: A working demonstration of a core component of the generator, showcasing its functionality and understanding of the underlying principles.
  • Conceptual Quizzes/Discussions: Short quizzes or group discussions to assess understanding of theoretical concepts (e.g., TDD principles, types of test doubles, AST structure).
  • Self-Reflection & Journaling: Encouragement to reflect on learning progress, challenges faced, and solutions discovered.

This comprehensive study plan provides a solid foundation for anyone looking to delve into the intricate world of unit testing and the exciting domain of automated test generation. By following this structured approach, you will be well-prepared to contribute to or even lead the development of a "Unit Test Generator."

gemini Output

This output constitutes Step 2 of 3 in the "Unit Test Generator" workflow, focusing on the gemini -> generate_code phase. The objective is to provide a robust, well-structured, and production-ready Python script that can generate unit tests for a given Python function. This deliverable aims to empower developers to quickly scaffold comprehensive test suites, thereby accelerating development and improving code quality.


1. Introduction: The Unit Test Generator Script

This document delivers a Python script designed to act as a "Unit Test Generator." Leveraging advanced analytical capabilities (simulating a powerful language model's understanding), this script analyzes a target Python function's source code and automatically proposes a set of diverse unit test cases. The output is a unittest.TestCase class,

javascript

// File: userService.test.js

const UserService = require('./userService'); // Assuming CommonJS module

const UserRepository = require('./userRepository'); // Assuming CommonJS module

// Mock the UserRepository dependency

jest.mock('./userRepository');

describe('UserService', () => {

let userService;

let mockUserRepository;

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