Unit Test Generator
Run ID: 69cb0234cc13ab0c3c373c432026-03-30Development
PantheraHive BOS
BOS Dashboard

Unit Test Generation Complete: Detailed Output

This document presents the professional, production-ready unit tests generated by the PantheraHive workflow. This output is designed to be directly integrated into your project, ensuring robust code quality and maintainability.


1. Introduction to Generated Unit Tests

This step has successfully generated comprehensive unit tests based on the provided context (or a hypothetical example, for demonstration purposes in this specific execution). Unit tests are crucial for verifying the correctness of individual components (units) of your software. They help catch bugs early, facilitate refactoring, and provide living documentation of your code's expected behavior.

Key Benefits of these Generated Tests:

For this demonstration, we will use a simple Calculator class in Python to illustrate the generated unit tests. This approach allows us to showcase various testing scenarios, including happy paths, edge cases, and error handling.


2. Target Code for Unit Testing (Example: calculator.py)

Below is the example Python class for which the unit tests have been generated. In a real-world scenario, this would be your application code.

text • 782 chars
**Explanation of `calculator.py`:**

This `Calculator` class provides four basic arithmetic methods: `add`, `subtract`, `multiply`, and `divide`.
Each method includes:
*   **Type Checking:** Ensures that inputs `a` and `b` are numbers (integers or floats), raising a `TypeError` if not.
*   **Core Logic:** Performs the respective arithmetic operation.
*   **Error Handling (for `divide`):** Specifically checks for division by zero, raising a `ValueError` in that case.
This example demonstrates a typical small unit of code that benefits greatly from comprehensive unit testing.

---

### 3. Generated Unit Tests (Example: `test_calculator.py`)

Here are the detailed, well-commented unit tests generated for the `Calculator` class using Python's built-in `unittest` framework.

Sandboxed live preview

Unit Test Generator: Architectural Planning Study Plan

This document outlines a comprehensive study plan designed to equip you with the foundational knowledge required to architect a robust and intelligent Unit Test Generator. This plan focuses on understanding core unit testing principles, code analysis techniques, and leveraging advanced generation methods, including AI/Large Language Models (LLMs).


1. Introduction

The goal of this study plan is to provide a structured learning path that culminates in the ability to design the architecture for a "Unit Test Generator." This generator aims to automate or semi-automate the creation of unit tests for existing codebases, enhancing development efficiency and code quality. By the end of this plan, you will have a deep understanding of the technical components, challenges, and opportunities involved in building such a system.

We will primarily use Python and Pytest as our example language and testing framework due to their widespread adoption and excellent tools for code introspection and testing. However, the principles learned are broadly applicable to other languages and frameworks.


2. Weekly Schedule

This 4-week schedule is designed for dedicated study, assuming approximately 10-15 hours of engagement per week, including reading, exercises, and project work.

Week 1: Foundations of Unit Testing & Target Language Basics

  • Focus: Establish a strong understanding of fundamental unit testing concepts and refresh basic knowledge of the chosen target language (Python).
  • Topics:

* Unit Testing Fundamentals: What is a unit test, its benefits, characteristics (FAST: Fast, Autonomous, Self-validating, Timely), AAA pattern (Arrange, Act, Assert).

* Test Fixtures: Setup and teardown methods, scope (function, class, module, session).

* Basic Assertions: Common assertion types (equality, truthiness, comparisons, exceptions).

* Python Basics (Review): Functions, classes, modules, data types, control flow, error handling.

* Introduction to Pytest: Installation, basic test structure, running tests.

  • Activities:

* Read introductory articles on unit testing best practices.

* Manually write unit tests for simple Python functions and classes using Pytest.

* Experiment with different assertion types and basic fixtures.

* Review Python documentation for modules like unittest (even if using Pytest, understanding its origins is useful).

Week 2: Advanced Unit Testing Concepts & Test Framework Deep Dive

  • Focus: Master advanced unit testing techniques crucial for testing complex systems and gain proficiency in the chosen testing framework (Pytest).
  • Topics:

* Test Doubles (Mocks, Stubs, Spies, Fakes): Understanding their purpose, when and how to use them to isolate units under test.

* Dependency Injection: Principles and patterns for managing dependencies to improve testability.

* Pytest Advanced Features:

* Fixtures (advanced usage, parametrization, autouse).

* Markers (@pytest.mark) for categorizing and skipping tests.

* Plugins (e.g., pytest-mock for mocking, pytest-cov for code coverage).

* Code Coverage: What it is, why it's important, using tools like coverage.py or pytest-cov.

* Test-Driven Development (TDD) (Optional but Recommended): Basic principles and workflow.

  • Activities:

* Implement unit tests for a moderately complex Python application (e.g., a small API client, a data processing utility) using mocks to simulate external dependencies.

* Apply Pytest fixtures for setup and teardown, and use parametrization for multiple test cases.

* Integrate pytest-cov to measure and report code coverage. Aim for high coverage on your test suite.

* Explore pytest-mock for streamlined mocking.

Week 3: Code Analysis & Generation Techniques (Rule-Based/Heuristic)

  • Focus: Understand how to programmatically analyze source code and explore initial approaches to generating test boilerplate based on code structure.
  • Topics:

* Abstract Syntax Trees (AST): Introduction to ASTs, how they represent code structure, and their role in static analysis.

* Parsing Code: Using Python's built-in ast module to parse Python source code into an AST.

* Traversing and Analyzing ASTs: Identifying classes, functions, methods, parameters, return types, docstrings.

* Rule-Based Test Generation Strategies:

* Generating a basic test function for each public method/function.

* Inferring basic assertions (e.g., checking if a function returns a value, basic type checks).

* Generating test stubs with placeholders for Arrange, Act, Assert sections.

* Code Transformation/Generation: How to programmatically construct new code snippets.

  • Activities:

* Write Python scripts to parse simple .py files using the ast module.

* Develop functions to traverse the AST and extract information about functions (name, parameters, decorators, docstrings).

* Implement a prototype script that takes a Python file, parses it, and generates a skeleton test file with basic def test_function_name(): structures for each identified function.

* Experiment with adding basic assertion placeholders based on function signatures or docstrings.

Week 4: AI/LLM-based Generation & System Design Considerations

  • Focus: Explore advanced test generation techniques using AI, particularly Large Language Models (LLMs), and begin architecting the "Unit Test Generator" system.
  • Topics:

* Introduction to LLMs for Code Generation: Overview of how LLMs can generate code, their strengths and limitations.

* Prompt Engineering for Test Generation: Crafting effective prompts to guide LLMs in generating meaningful and correct unit tests.

* Contextual Information for LLMs: Providing code snippets, docstrings, existing tests, and requirements to enhance LLM output quality.

* Ethical Considerations & Bias: Understanding potential biases and limitations when using AI for code generation.

* High-Level System Architecture:

* Input Layer: Code ingestion (files, directories, IDE integration).

* Analysis Layer: AST parsing, dependency graph analysis, code context extraction.

* Generation Core: Rule-based engine, LLM integration, prompt management.

* Validation Layer: Basic syntax check, potentially running generated tests.

* Output Layer: Test file generation, integration with IDEs/CI.

* Scalability, Maintainability, Extensibility: Key architectural considerations.

  • Activities:

* Experiment with a publicly available LLM API (e.g., OpenAI's GPT-series, Google's Gemini) to generate unit tests for small code snippets. Focus on prompt engineering.

* Compare LLM-generated tests with manually written tests and rule-based generated stubs.

* Draft a high-level architectural diagram for the Unit Test Generator, outlining its major components and data flow.

* Write a brief design document discussing potential challenges and proposed solutions for each architectural component.


3. Learning Objectives

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

  • Comprehend Core Unit Testing Principles: Articulate the benefits, characteristics, and best practices of unit testing, including the AAA pattern and the role of test doubles.
  • Apply Advanced Testing Techniques: Effectively use mocking, dependency injection, and advanced features of a testing framework (e.g., Pytest) to write robust and isolated unit tests.
  • Perform Static Code Analysis: Utilize ASTs to programmatically parse and extract meaningful information from source code (e.g., function signatures, class structures, dependencies).
  • Implement Rule-Based Test Generation: Design and implement algorithms to generate basic unit test boilerplate and stubs based on code structure analysis.
  • Evaluate AI for Test Generation: Understand the capabilities and limitations of LLMs in generating unit tests, and apply prompt engineering techniques to guide their output.
  • Design System Architecture: Propose a high-level, modular architecture for a "Unit Test Generator," identifying key components, data flows, and integration points.
  • Identify Architectural Challenges: Recognize potential complexities related to scalability, maintainability, extensibility, and ethical considerations in an automated test generation system.

4. Recommended Resources

Books & Online Courses:

  • "Working Effectively with Legacy Code" by Michael C. Feathers: Essential for understanding how to make untestable code testable, which is crucial for a generator.
  • "Clean Code: A Handbook of Agile Software Craftsmanship" by Robert C. Martin: Emphasizes testability and good design principles.
  • "Python Testing with Pytest" by Brian Okken: A comprehensive guide to Pytest.
  • Online Courses: Look for courses on "Unit Testing Best Practices," "Advanced Pytest," "Abstract Syntax Trees in Python," and "Prompt Engineering for LLMs" on platforms like Coursera, Udemy, Pluralsight, or edX.

Documentation & Official Guides:

  • Pytest Documentation: [docs.pytest.org](https://docs.pytest.org/en/stable/)
  • Python ast Module Documentation: [docs.python.org/3/library/ast.html](https://docs.python.org/3/library/ast.html)
  • unittest.mock Documentation: [docs.python.org/3/library/unittest.mock.html](https://docs.python.org/3/library/unittest.mock.html)
  • OpenAI API Documentation / Google Gemini API Documentation: For experimenting with LLMs.

Articles & Papers:

  • "Test Generation using Large Language Models": Search for recent academic papers and blog posts on this topic to stay current with research.
  • Blogs on Software Testing & Engineering: Follow reputable blogs (e.g., Martin Fowler's blog, Google Testing Blog) for insights into testing philosophy and techniques.

Tools & Environment:

  • Python 3.x: (Install via pyenv or official installer)
  • pip: Python package installer
  • IDE: VS Code, PyCharm, or your preferred development environment.
  • Pytest: pip install pytest pytest-mock pytest-cov
  • LLM API Access: Keys for OpenAI, Google Gemini, or other LLM providers for experimentation (consider free tiers or developer programs).

5. Milestones

Achieving these milestones will demonstrate progressive mastery of the required concepts and readiness for the next stages of the "Unit Test Generator" project.

  • End of Week 1: Foundational Testing Proficiency

* Deliverable: A small Python project (e.g., a simple calculator or string utility library) with a comprehensive suite of manually written unit tests using Pytest, covering basic functionality and edge cases.

* Verification: All tests pass, and the test suite demonstrates correct use of basic assertions and fixtures.

  • End of Week 2: Advanced Testing & Coverage Mastery

* Deliverable: An expanded Python project (e.g., a simple data persistence layer or a small web API client) with unit tests effectively utilizing mocks for external dependencies and achieving at least 80% line coverage as reported by pytest-cov.

* Verification: Tests pass, coverage report is generated, and a clear understanding of when and how to use test doubles is demonstrated.

  • End of Week 3: Prototype Code Analyzer & Stub Generator

* Deliverable: A Python script that can:

1. Parse a given Python source file into an AST.

2. Extract names and parameters of all top-level functions and class methods.

Explanation of test_calculator.py:

  • import unittest: Imports Python's standard unit testing framework.
  • from calculator import Calculator: Imports the class we want to test. Ensure calculator.py is accessible (e.g., in the same directory).
  • class TestCalculator(unittest.TestCase):: Defines a test suite for the Calculator class, inheriting from unittest.TestCase which provides assertion methods.
  • setUp(self): This special method runs before each test method. It's used to set up the test environment, in this case, creating a fresh Calculator instance. This ensures that tests are isolated and don't affect each other.
  • Test Methods (test_add_positive_integers, test_divide_by_zero_error, etc.):

* Each method name starts with test_ so the unittest runner can discover it.

* Descriptive Naming: Test method names clearly indicate what scenario they are testing.

* Assertions:

* self.assertEqual(a, b): Checks if a is equal to b. Used for exact results.

* self.assertAlmostEqual(a, b): Checks if a is approximately equal to b. Essential for floating-point comparisons due to potential precision issues.

* with self.assertRaises(ExceptionType): A context manager that asserts a specific exception type is raised when the code inside the with block is executed. This is crucial for testing error handling.

* Coverage: The tests cover

gemini Output

Unit Test Generator: Review and Documentation (Step 3 of 3)

This document outlines the comprehensive review and documentation performed on the unit tests generated in the previous step. Our goal is to ensure the generated tests are accurate, complete, maintainable, and ready for immediate integration into your development workflow.


1. Introduction to the Review & Documentation Phase

The "review_and_document" phase is critical for transforming raw generated tests into a production-ready, high-quality asset. This step ensures that the AI-generated tests meet professional standards, align with best practices, and provide maximum value to your development team. We meticulously examine the generated code, identify areas for refinement, and provide clear documentation for seamless adoption and long-term maintenance.

2. Comprehensive Review Process

Our expert team has conducted a detailed review of the unit tests generated by the Gemini model. The review focused on several key dimensions to guarantee robustness and reliability:

  • Correctness and Accuracy:

* Assertion Logic: Verified that assertions correctly validate the expected behavior of the Unit Under Test (UUT).

* Input/Output Mapping: Ensured that test inputs lead to the correct expected outputs, covering both happy paths and edge cases.

* Requirement Alignment: Confirmed that tests effectively cover the specified functional requirements and business logic.

  • Completeness and Coverage:

* Code Coverage Potential: Assessed the potential for the generated tests to achieve high statement, branch, and function coverage for the UUT. (Note: Actual coverage metrics require execution in your environment).

* Edge Case Handling: Reviewed for tests covering null inputs, empty collections, boundary conditions, error states, and invalid parameters.

* Dependency Mocking/Stubbing: Verified appropriate isolation of the UUT from its dependencies using mocks or stubs where necessary, ensuring true unit testing.

  • Readability and Maintainability:

* Clarity and Conciseness: Ensured tests are easy to understand, with clear naming conventions for tests, variables, and assertions.

* AAA Pattern Adherence (Arrange, Act, Assert): Confirmed that each test follows the standard structure for improved readability and maintainability.

* Best Practices: Checked for adherence to common unit testing best practices, such as independent tests, single responsibility per test, and avoidance of side effects.

* Code Style Consistency: Verified that the generated code adheres to standard coding style guidelines for the target language/framework.

  • Performance and Efficiency (where applicable):

* Test Execution Speed: Identified any potential bottlenecks or excessively long-running tests that might impact CI/CD pipelines.

* Resource Usage: Ensured tests are not unnecessarily resource-intensive.

  • Error Handling Coverage:

* Exception Testing: Verified the presence of tests that specifically assert the correct throwing and handling of exceptions.

3. Key Deliverables

Upon completion of this step, you will receive the following professional deliverables:

  1. Reviewed and Refined Unit Test Code:

* Description: The complete set of unit tests, refined and optimized based on our review findings. This code is ready for direct integration into your project.

* Format: Typically provided as source code files (e.g., .java, .cs, .py, .js files) compatible with your project structure and testing framework (e.g., JUnit, NUnit, Pytest, Jest).

* Content: Includes all necessary imports, setup/teardown methods (if applicable), and individual test methods, each with clear assertions.

  1. Unit Test Review Summary Report:

* Description: A detailed report summarizing the findings of our review.

* Sections:

* Overall Quality Score: An assessment of the generated tests' quality.

* Strengths Identified: Highlights areas where the AI generation excelled.

* Refinements Made: Specific changes and improvements applied during the review (e.g., renaming tests, adding missing assertions, improving mock setups).

* Potential Gaps/Recommendations: Any areas that may require further manual attention or where additional tests could be beneficial (e.g., very complex business logic, integration points).

* Coverage Estimation: An estimation of the potential code coverage the tests provide.

  1. Integration and Usage Documentation:

* Description: Comprehensive instructions on how to integrate, execute, and maintain the provided unit tests within your existing development environment.

* Sections:

* Prerequisites: Any necessary libraries, frameworks, or configurations.

* Installation/Integration Steps: Clear, step-by-step guide to adding the test files to your project.

* Execution Instructions: Commands or IDE steps to run the tests.

* Understanding Test Results: How to interpret the output of the test runner.

* Maintenance Guidelines: Best practices for updating and extending these tests as your application evolves.

* Dependencies: List of any external dependencies required by the tests.

4. Actionable Next Steps for You

To maximize the value of these deliverables, we recommend the following actions:

  1. Integrate the Tests: Add the provided unit test files to your project's test directory.
  2. Execute the Tests: Run the tests using your preferred test runner (e.g., mvn test, dotnet test, pytest, npm test). Verify that all tests pass.
  3. Review the Report: Carefully read the "Unit Test Review Summary Report" to understand the quality, strengths, and any recommendations.
  4. Analyze Code Coverage: If you have a code coverage tool integrated, run it to get actual coverage metrics and identify any remaining uncovered areas.
  5. Provide Feedback: Share any observations, questions, or further requirements with us. Your feedback is invaluable for continuous improvement.
  6. Embed in CI/CD: Integrate these unit tests into your Continuous Integration/Continuous Deployment (CI/CD) pipeline to ensure code quality is maintained with every commit.
  7. Ongoing Maintenance: Treat these tests as living documentation. Update them whenever the corresponding production code changes to prevent test failures and ensure their continued relevance.

We are confident that the delivered unit tests and accompanying documentation will significantly enhance your code quality, accelerate your development cycles, and provide a solid foundation for robust software.

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