Repository: HimanshuNarware/Devlabs Branch: main Commit: 862f874132f3 Files: 171 Total size: 899.1 KB Directory structure: gitextract_wq4xmcei/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── adding-new-tool.yml │ │ ├── bug_report.yml │ │ ├── documentation_update.yml │ │ └── feature_request.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── auto-comment-on-pr-merge.yml │ ├── check_duplicate_tools.yml │ ├── close-old-pr-woc.yml │ ├── close-on-merge.yml │ ├── greetings.yaml │ ├── greetings.yml │ └── restrict_pr.yml ├── .idea/ │ ├── .gitignore │ ├── Devlabs-copy.iml │ ├── Devlabs.iml │ ├── modules.xml │ └── vcs.xml ├── .vscode/ │ └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── README.md ├── backend/ │ ├── .dockerignore │ ├── .gitignore │ ├── Dockerfile │ ├── init/ │ │ └── sampleToolsData.js │ ├── package.json │ ├── readme.md │ ├── server.js │ ├── src/ │ │ ├── app.js │ │ ├── config/ │ │ │ ├── ExpressError.js │ │ │ ├── database.js │ │ │ └── nodemailer.js │ │ ├── controllers/ │ │ │ ├── openSourceController.js │ │ │ ├── specialController.js │ │ │ ├── toolController.js │ │ │ └── userController.js │ │ ├── models/ │ │ │ ├── OpenSource.js │ │ │ ├── Tool.js │ │ │ ├── User.js │ │ │ └── reviewForm.js │ │ └── routes/ │ │ ├── openSource.js │ │ ├── special.js │ │ ├── tools.js │ │ └── user.js │ └── vercel.json ├── docker-compose.yaml ├── frontend/ │ ├── .dockerignore │ ├── .gitignore │ ├── Dockerfile │ ├── package.json │ ├── public/ │ │ ├── index.html │ │ ├── manifest.json │ │ └── robots.txt │ └── src/ │ ├── App.css │ ├── App.js │ ├── ChatAssistant/ │ │ ├── Avatar.jsx │ │ ├── ChatAssistant.css │ │ ├── ChatAssistant.jsx │ │ └── UserAvatar.jsx │ ├── ChatBot/ │ │ ├── ActionProvider.jsx │ │ ├── MessageParser.jsx │ │ └── config.jsx │ ├── Component/ │ │ ├── About.js │ │ ├── BackToTopButton.js │ │ ├── BookMark.js │ │ ├── Contact.jsx │ │ ├── Faq.js │ │ ├── Footer.js │ │ ├── Home.js │ │ ├── Login.css │ │ ├── Login.js │ │ ├── Modal.js │ │ ├── Navbar/ │ │ │ ├── Navbar.js │ │ │ ├── NavbarCenter.js │ │ │ ├── NavbarItem.js │ │ │ ├── NavbarLeft.js │ │ │ ├── NavbarRight.js │ │ │ └── Progress.js │ │ ├── NotFound.js │ │ ├── OpenSource.js │ │ ├── Pagination.js │ │ ├── Preloader.js │ │ ├── PrivacyPolicy.css │ │ ├── PrivacyPolicy.js │ │ ├── Profile.js │ │ ├── Rate.css │ │ ├── Rate.jsx │ │ ├── Rateus.js │ │ ├── Register.css │ │ ├── Register.js │ │ ├── Review.js │ │ ├── ScrollToTop.jsx │ │ ├── Sidebar/ │ │ │ ├── Sidebar.js │ │ │ └── SidebarContent.js │ │ ├── Signup.js │ │ ├── TermsOfService.css │ │ ├── TermsOfService.js │ │ ├── TrailingCursor/ │ │ │ ├── TrailingCursor.jsx │ │ │ ├── TrailingCursor.module.css │ │ │ └── index.js │ │ └── accordion.js │ ├── DB/ │ │ ├── openSource.json │ │ └── product.json │ ├── Data.js │ ├── Slice/ │ │ └── DataSlice.js │ ├── Store/ │ │ └── store.js │ ├── index.css │ ├── index.js │ ├── lottie/ │ │ ├── bookmark.json │ │ ├── contact.json │ │ └── pre.json │ ├── pages/ │ │ ├── AI.jsx │ │ ├── BackendTools.jsx │ │ ├── CodingPlatform.jsx │ │ ├── Collaboration.jsx │ │ ├── CoursesPlatform.jsx │ │ ├── EthicalHacking.jsx │ │ ├── Extension.jsx │ │ ├── Extensions.jsx │ │ ├── FrontendTools.jsx │ │ ├── Movie.jsx │ │ ├── Movies.jsx │ │ ├── Productivity.jsx │ │ ├── RemoteJob.jsx │ │ ├── RemoteJobs.jsx │ │ ├── Testimonials.jsx │ │ ├── UI.jsx │ │ └── UserInterface.jsx │ ├── style/ │ │ ├── AI.css │ │ ├── About.css │ │ ├── Animations.css │ │ ├── BackToTopButton.css │ │ ├── BackendTools.css │ │ ├── BookMark.css │ │ ├── CodingPlatform.css │ │ ├── Collaboration.css │ │ ├── Contact.css │ │ ├── Courses.css │ │ ├── EthicalHacking.css │ │ ├── Extension.css │ │ ├── Extensions.css │ │ ├── Footer.css │ │ ├── FrontendTools.css │ │ ├── Home.css │ │ ├── Modal.css │ │ ├── Movie.css │ │ ├── Movies.css │ │ ├── Navbar.css │ │ ├── NotFound.css │ │ ├── OpenSource.css │ │ ├── Pagination.css │ │ ├── Productivity.css │ │ ├── Profile.css │ │ ├── Rateus.css │ │ ├── RemoteJobs.css │ │ ├── Remotejob.css │ │ ├── Review.css │ │ ├── Sidebar.css │ │ ├── Signup.css │ │ ├── Testimonials.module.css │ │ ├── Typography.css │ │ ├── UI.css │ │ ├── UserInterface.css │ │ ├── alert.css │ │ ├── faq.css │ │ ├── preloader.css │ │ └── tooltip.css │ └── utils/ │ └── paginationData.js ├── learn.md └── package.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ================================================ FILE: .github/ISSUE_TEMPLATE/adding-new-tool.yml ================================================ name: 🛠️ Adding New Tool description: Want to add new tool on the Devlabs title: "[New Tool]: " body: - type: checkboxes id: existing-issue attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists related to this new tool. options: - label: I have searched the existing issues required: true - type: textarea id: Tool-description attributes: label: New Tool Description description: Please provide a detailed description of the tool you wanna add. placeholder: "Describe the new tool or enhancement you'd like to see." validations: required: true - type: textarea id: use-case attributes: label: Use Case description: How would this tool enhance your use of the project? placeholder: Describe a specific use case or scenario where this tool would be beneficial. validations: required: true - type: textarea id: benefits attributes: label: Benefits description: What benefits would this tool bring to the project or community? placeholder: Explain the advantages of implementing this new tool. - type: textarea id: screenShots attributes: label: Add ScreenShots description: If any... - type: dropdown id: priority attributes: label: Priority description: How important is this new tool to you? options: - High - Medium - Low default: 0 validations: required: true - type: checkboxes id: terms attributes: label: Record options: - label: "I have read the Contributing Guidelines" required: true - label: "I'm a GSSOC'24 contributor" required: true - label: "I have starred the repository" required: true ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ name: Bug report 🐞 description: File a bug report title: "[Bug]: " body: - type: checkboxes id: existing-issue attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for the bug you encountered. options: - label: I have searched the existing issues required: true - type: textarea id: what-happened attributes: label: Describe the bug description: A concise description of what you are experiencing. placeholder: Tell us what you see! validations: required: true - type: textarea id: expected-behaviour attributes: label: Expected behavior description: A clear and concise description of what you expected to happen. validations: required: true - type: textarea id: screenshots attributes: label: Add ScreenShots description: Add sufficient ScreenShots to explain your issue. - type: dropdown id: browsers attributes: label: What browsers are you seeing the problem on? multiple: true options: - Firefox - Chrome - Safari - Microsoft Edge - type: checkboxes id: terms attributes: label: Record options: - label: "I have read the Contributing Guidelines" required: true - label: "I'm a GSSOC'24 contributor" required: true - label: "I have starred the repository" required: true ================================================ FILE: .github/ISSUE_TEMPLATE/documentation_update.yml ================================================ name: 📝 Documentation Update description: Improve Documentation title: "[Documentation Update]: " body: - type: checkboxes id: existing-issue attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for the updates you want to make. options: - label: I have searched the existing issues required: true - type: textarea id: issue-description attributes: label: Issue Description description: Please provide a clear description of the documentation update you are suggesting. placeholder: Describe the improvement or correction you'd like to see in the documentation. validations: required: true - type: textarea id: suggested-change attributes: label: Suggested Change description: Provide details of the proposed change to the documentation. placeholder: Explain how the documentation should be updated or corrected. validations: required: true - type: textarea id: rationale attributes: label: Rationale description: Why is this documentation update necessary or beneficial? placeholder: Explain the importance or reasoning behind the suggested change. validations: required: False - type: dropdown id: urgency attributes: label: Urgency description: How urgently do you believe this documentation update is needed? options: - High - Medium - Low default: 0 validations: required: true - type: checkboxes id: terms attributes: label: Record options: - label: "I have read the Contributing Guidelines" required: true - label: "I'm a GSSOC'24 contributor" required: true - label: "I have starred the repository" required: true ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.yml ================================================ name: ✨ Feature Request description: Suggest a feature title: "[Feature Request]: " body: - type: checkboxes id: existing-issue attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for this feature. options: - label: I have searched the existing issues required: true - type: textarea id: feature-description attributes: label: Feature Description description: Please provide a detailed description of the feature you are requesting. placeholder: Describe the new feature or enhancement you'd like to see. validations: required: true - type: textarea id: use-case attributes: label: Use Case description: How would this feature enhance your use of the project? placeholder: Describe a specific use case or scenario where this feature would be beneficial. validations: required: true - type: textarea id: benefits attributes: label: Benefits description: What benefits would this feature bring to the project or community? placeholder: Explain the advantages of implementing this feature. - type: textarea id: screenShots attributes: label: Add ScreenShots description: If any... - type: dropdown id: priority attributes: label: Priority description: How important is this feature to you? options: - High - Medium - Low default: 0 validations: required: true - type: checkboxes id: terms attributes: label: Record options: - label: "I have read the Contributing Guidelines" required: true - label: "I'm a GSSOC'24 contributor" required: true - label: "I have starred the repository" required: true ================================================ FILE: .github/pull_request_template.md ================================================ ## Related Issue [Cite any related issue(s) this pull request addresses. If none, simply state "None”] ## Description [Please include a brief description of the changes or features added] ## Type of PR - [ ] Bug fix - [ ] Feature enhancement - [ ] Documentation update - [ ] Other (specify): _______________ ## Screenshots / videos (if applicable) [Attach any relevant screenshots or videos demonstrating the changes] ## Checklist: - [ ] I have performed a self-review of my code - [ ] I have read and followed the Contribution Guidelines. - [ ] I have tested the changes thoroughly before submitting this pull request. - [ ] I have provided relevant issue numbers, screenshots, and videos after making the changes. - [ ] I have commented my code, particularly in hard-to-understand areas. ## Additional context: [Include any additional information or context that might be helpful for reviewers.] ================================================ FILE: .github/workflows/auto-comment-on-pr-merge.yml ================================================ # @format name: Auto Comment on PR Merge on: pull_request: types: [closed] jobs: comment: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - name: Add Comment to Merged PR env: TOKEN: ${{ secrets.TOKEN }} run: | curl -H "Authorization: token $TOKEN" \ -X POST \ -d '{"body":"🎉 Your pull request has been successfully merged! 🎉 Thank you for your contribution to our project. Your efforts are greatly appreciated. Keep up the fantastic work! 🚀"}' \ "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" ================================================ FILE: .github/workflows/check_duplicate_tools.yml ================================================ # @format name: Check for Duplicates and Close Issues on PR Merge on: pull_request: types: [opened, synchronize, closed] jobs: check-duplicates: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Check for duplicate entries in product.json run: | # Check for duplicate entries based on the 'link' field in product.json jq -r '.[].link' product.json | sort | uniq -d > duplicates.txt if [ -s duplicates.txt ]; then echo "Duplicate entries found in product.json based on 'link':" cat duplicates.txt exit 1 else echo "No duplicate entries found based on 'link'." fi close-issues: runs-on: ubuntu-latest needs: check-duplicates if: github.event.pull_request.merged == true steps: - name: Checkout repository uses: actions/checkout@v2 - name: Close linked issues run: | ISSUES=$(jq -r '.pull_request.body' "$GITHUB_EVENT_PATH" | grep -Eo '#[0-9]+' | tr -d '#') for ISSUE in $ISSUES do echo "Closing issue #$ISSUE" curl -X POST -H "Authorization: token ${{ secrets.TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/${{ github.repository }}/issues/$ISSUE/comments \ -d '{"body":"Closed by PR #${{ github.event.pull_request.number }}"}' curl -X PATCH -H "Authorization: token ${{ secrets.TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/${{ github.repository }}/issues/$ISSUE \ -d '{"state":"closed"}' done ================================================ FILE: .github/workflows/close-old-pr-woc.yml ================================================ # @format name: Close Stale PRs on: schedule: - cron: '0 0 * * *' # Runs daily at midnight pull_request: types: - opened - reopened - synchronize permissions: pull-requests: write issues: write jobs: close_stale_prs: runs-on: ubuntu-latest permissions: pull-requests: write steps: - uses: actions/stale@v7 with: repo-token: ${{ secrets.TOKEN }} stale-pr-message: 'This PR has been automatically closed due to inactivity from the owner for 15 days.' days-before-pr-stale: 15 days-before-pr-close: 0 exempt-pr-author: false exempt-pr-labels: '' only-labels: '' operations-per-run: 30 remove-stale-when-updated: true debug-only: false ================================================ FILE: .github/workflows/close-on-merge.yml ================================================ # @format name: Close Issues on PR Merge on: pull_request: types: [closed] jobs: close-issues: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Close linked issues if: github.event.pull_request.merged == true run: | ISSUES=$(jq -r '.pull_request.body' "$GITHUB_EVENT_PATH" | grep -Eo '#[0-9]+' | tr -d '#') for ISSUE in $ISSUES do echo "Closing issue #$ISSUE" curl -X POST -H "Authorization: token ${{ secrets.TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/${{ github.repository }}/issues/$ISSUE/comments \ -d '{"body":"Closed by PR #${{ github.event.pull_request.number }}"}' curl -X PATCH -H "Authorization: token ${{ secrets.TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/${{ github.repository }}/issues/$ISSUE \ -d '{"state":"closed"}' done ================================================ FILE: .github/workflows/greetings.yaml ================================================ # @format name: Greetings on: [pull_request_target, issues] jobs: greeting: runs-on: ubuntu-latest permissions: issues: write pull-requests: write steps: - uses: actions/first-interaction@v1 with: repo-token: ${{ secrets.TOKEN }} issue-message: 'Hi there! Thanks for opening this issue. We appreciate your contribution to this open-source project. We aim to respond or assign your issue as soon as possible.' pr-message: 'Welcome to Our repository.🎊 Thank you so much for taking the time to point this out.' ================================================ FILE: .github/workflows/greetings.yml ================================================ # @format name: 'Greetings' on: fork: push: branches: [main] issues: types: [opened] pull_request_target: types: [opened] jobs: welcome: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: EddieHubCommunity/gh-action-community/src/welcome@main with: github-token: ${{ secrets.TOKEN }} issue-message: | Congratulations, @${{ github.actor }}! 🎉 Thank you for creating your issue. Your contribution is greatly appreciated and we look forward to working with you to resolve the issue. Keep up the great work! pr-message: | Great job, @${{ github.actor }}! 🎉 Thank you for submitting your pull request. Your contribution is valuable and we appreciate your efforts to improve our project. footer: 'We will promptly review your changes and offer feedback. Keep up the excellent work! Kindly remember to check our [contributing guidelines](https://github.com/HimanshuNarware/Devlabs/blob/main/CONTRIBUTING.md)' ================================================ FILE: .github/workflows/restrict_pr.yml ================================================ # @format name: Restrict Contributor to limited contributions in Devlabs on: pull_request_target: types: - opened jobs: evaluate_and_close: runs-on: ubuntu-latest steps: - name: Check merged pull requests and calculate score id: calculate_score uses: actions/github-script@v4 with: github-token: ${{ secrets.TOKEN }} script: | const owner = context.repo.owner; const repo = context.repo.repo; const pullRequestOpener = context.payload.pull_request.user.login; let mergedPullRequests = []; let page = 1; let perPage = 100; let response; do { response = await github.pulls.list({ owner, repo, state: 'closed', per_page: perPage, page: page }); mergedPullRequests = mergedPullRequests.concat(response.data.filter(pr => pr.user.login === pullRequestOpener && pr.merged_at !== null)); page++; } while (response.data.length === perPage); let score = 0; let prDetails = []; const scoreMap = { 'level3': 45, 'level2': 25, 'level1': 10 }; for (const pr of mergedPullRequests) { let prScore = 0; let labelsWithScores = []; for (const label of pr.labels) { if (scoreMap[label.name]) { prScore += scoreMap[label.name]; labelsWithScores.push(`${label.name} score: (${scoreMap[label.name]})`); } } score += prScore; if (labelsWithScores.length > 0) { prDetails.push(`- [#${pr.number}](${pr.html_url}) with labels: ${labelsWithScores.join(', ')}`); } } const threshold = 150; console.log(`User score: ${score}`); console.log(`Score threshold: ${threshold}`); if (score >= threshold) { const comment = `Hey @${pullRequestOpener}, You have reached your limit to contribute in Devlabs with a score of ${score}. \n We believe in giving equal opportunity to everyone so you will not be able to contribute to Devlabs now onwards. 💗 \n Thank you for your valuable time and contribution in Devlabs 🕹️! \n\n Your merged pull requests:\n${prDetails.join('\n')}`; core.exportVariable('comment_body', comment); core.setOutput('close_pull_request', true); } else { core.exportVariable('comment_body', ''); core.setOutput('close_pull_request', false); } - name: Add spam label and close the pull request if: always() && steps.calculate_score.outputs.close_pull_request == 'true' uses: actions/github-script@v4 with: github-token: ${{ secrets.TOKEN }} script: | const owner = context.repo.owner; const repo = context.repo.repo; const pullRequestNumber = context.payload.pull_request.number; const comment = process.env.comment_body; if (comment.trim() === '') { console.log('Comment body is empty. Skipping comment creation.'); return; } await github.issues.createComment({ owner, repo, issue_number: pullRequestNumber, body: comment }); await github.issues.addLabels({ owner, repo, issue_number: pullRequestNumber, labels: ['spam🚨'] }); await github.pulls.update({ owner, repo, pull_number: pullRequestNumber, state: 'closed' }); ================================================ FILE: .idea/.gitignore ================================================ # Default ignored files /shelf/ /workspace.xml # Editor-based HTTP Client requests /httpRequests/ ================================================ FILE: .idea/Devlabs-copy.iml ================================================ ================================================ FILE: .idea/Devlabs.iml ================================================ ================================================ FILE: .idea/modules.xml ================================================ ================================================ FILE: .idea/vcs.xml ================================================ ================================================ FILE: .vscode/settings.json ================================================ { "git.ignoreLimitWarning": true, "emmet.includeLanguages": { "\"javascript\":": "\"javascriptreact\"" }, "C_Cpp.errorSquiggles": "disabled", "deepscan.enable": true } ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Devlabs Code of Conduct We, the maintainers and contributors of Devlabs, are committed to providing a friendly, safe, and inclusive environment for everyone who wants to participate in this project. We expect all participants to follow this Code of Conduct to ensure that our community is welcoming and harassment-free. ## Our Standards - **Be Respectful:** Treat all community members with respect and kindness. Respect each other's opinions, experiences, and backgrounds, even if they differ from your own. - **Be Inclusive:** Welcome people of all backgrounds, experiences, and perspectives. Discrimination, hate speech, and harassment will not be tolerated. - **Be Collaborative:** Work together constructively. Disagreements can happen, but they should be resolved through respectful and constructive discussion. - **Be Mindful of Your Language:** Be mindful of your words and actions. Avoid offensive or disrespectful comments and content. - **No Trolling or Harassment:** Do not engage in trolling, bullying, or harassment, whether it's based on race, gender, sexual orientation, disability, religion, or any other personal characteristics. - **Respect Privacy:** Do not share personal information of others without their explicit consent. ## Reporting Violations If you witness or experience any behavior that violates this Code of Conduct, please report it to the project maintainers. All reports will be kept confidential, and we will take appropriate action to address the issue. ## Enforcement Maintainers of Devlabs are responsible for enforcing this Code of Conduct. If someone engages in harmful behavior, maintainers may take action, ranging from a warning to temporary or permanent expulsion from the project. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html). By participating in the Devlabs community, you agree to abide by this Code of Conduct. We look forward to your contributions and collaboration! ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to [Devlabs] 🚀 Thank you for considering contributing to [Devlabs]! We appreciate your interest in helping make this project better. ## Table of Contents - [Contributing to \[Devlabs\]](#contributing-to-devlabs-) - [Table of Contents](#table-of-contents) - [Code of Conduct](#code-of-conduct) - [How Can I Contribute?](#how-can-i-contribute) - [Reporting Bugs](#reporting-bugs-) - [Requesting Features](#requesting-features-) - [Submitting Changes](#submitting-changes-) - [Pull Request Guidelines](#pull-request-guidelines-) - [Style Guide](#style-guide-) - [License](#license-) ## Code of Conduct This project and its community adhere to the [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report any unacceptable behavior to [project owner's email]. ## How Can I Contribute? 🌟 ### Reporting Bugs 🐛 If you come across a bug or an issue with [Devlabs], please take the following steps: 1. **Search** the [issue tracker](https://github.com/HimanshuNarware/Devlabs/issues) to check if the issue has already been reported. If it has, feel free to add any additional information or subscribe to the existing issue. 2. **Create a New Issue** if the issue hasn't been reported yet, with a descriptive title and a clear description of the problem. Include any relevant details such as operating system, browser version, and steps to reproduce the issue. ### Requesting Features ✨ If you have an idea for a new feature or improvement, please follow these steps: 1. **Search** the [issue tracker](https://github.com/HimanshuNarware/Devlabs/issues) to check if the feature request already exists. If it does, you can comment on the existing request to provide more information or express your interest. 2. **Create a New Issue** if the feature request doesn't exist, with a clear and concise title and a detailed description of the feature or enhancement you're proposing. Explain why it's valuable and how it aligns with the project's goals. ### Submitting Changes 🛠️ If you want to contribute code changes, follow these steps: 1. **Fork the repository** to your own GitHub account. 2. **Clone your forked repository** to your local machine. ```bash git clone https://github.com/HimanshuNarware/Devlabs.git ``` 3. **Create a new branch** for your changes. ```bash git checkout -b feature/your-feature-name ``` 4. **Make your changes**, following the [style guide](#style-guide) and ensuring that your code adheres to the project's coding standards. 5. **Commit your changes** with a descriptive commit message. ```bash git commit -m "Add new feature: your feature name" ``` 6. **Push your changes** to your forked repository on GitHub. ```bash git push origin feature/your-feature-name ``` 7. **Open a pull request (PR)** on the [original repository](https://github.com/HimanshuNarware/Devlabs) and provide a detailed description of your changes. ### Alternatively contribute using GitHub Desktop 🖥️ 1. **Open GitHub Desktop**: Launch GitHub Desktop and log in to your GitHub account if you haven't already. 2. **Clone the Repository**: - If you haven't cloned the repository yet, you can do so by clicking on the "File" menu and selecting "Clone Repository." - Choose the repository from the list of repositories on GitHub and clone it to your local machine. 3. **Switch to the Correct Branch**: - Ensure you are on the branch that you want to submit a pull request for. - If you need to switch branches, you can do so by clicking on the "Current Branch" dropdown menu and selecting the desired branch. 4. **Make Changes**: Make your changes to the code or files in the repository using your preferred code editor. 5. **Commit Changes**: - In GitHub Desktop, you'll see a list of the files you've changed. Check the box next to each file you want to include in the commit. - Enter a summary and description for your changes in the "Summary" and "Description" fields, respectively. Click the "Commit to " button to commit your changes to the local branch. 6. **Push Changes to GitHub**: After committing your changes, click the "Push origin" button in the top right corner of GitHub Desktop to push your changes to your forked repository on GitHub. 7. **Create a Pull Request**: - Go to the GitHub website and navigate to your fork of the repository. - You should see a button to "Compare & pull request" between your fork and the original repository. Click on it. 8. **Review and Submit**: - On the pull request page, review your changes and add any additional information, such as a title and description, that you want to include with your pull request. - Once you're satisfied, click the "Create pull request" button to submit your pull request. 9. **Wait for Review**: Your pull request will now be available for review by the project maintainers. They may provide feedback or ask for changes before merging your pull request into the main branch of the repository. ### Pull Request Guidelines 📋 To ensure a smooth review process, please follow these guidelines when submitting a pull request: - Your code should be well-documented and include clear comments where necessary. - Run any relevant tests to ensure that your changes don't introduce new issues. - Ensure your code follows the project's coding standards and style guide (see [Style Guide](#style-guide)). - Keep your pull request focused on a single feature or bug fix. - Provide a clear and concise title and description for your pull request. ## Style Guide 📚 [Devlabs] follows a specific coding style and structure. Please refer to the [style guide](STYLE_GUIDE.md) for details on code formatting, naming conventions, and other coding standards. ## License 📜 By contributing to [Devlabs], you agree that your contributions will be licensed under the project's [LICENSE](LICENSE.md). ================================================ FILE: README.md ================================================

Laptop DevLabs

Welcome to DevLabs, a website where you can search for free tools that are useful for your daily needs. This application is created by the incredible open-source community. On DevLabs, you can discover a collection of free tools that can assist you in various aspects of your life. Moreover, you have the opportunity to contribute to this project by adding more tools to the database.

Check out the live project at DevLabs

DevLabs
--- ![image](https://github.com/user-attachments/assets/71fa0091-f7be-4ece-a898-e39512c1beb0) ## 🏆 Featured in:
Event Logo Event Name Event Description
GSSoC 24 GirlScript Summer of Code 2024 GirlScript Summer of Code is a three-month-long Open Source Program conducted every summer by GirlScript Foundation. It is an initiative to bring more beginners to Open-Source Software Development.
## 🌟 Our Mission Our website provides a platform for contributors from all over the world to share their ideas in the form of helpful websites that are free to use. It helps us save a ton of time by allowing us to access a list of all the websites in one location. Whether it be a tool or an educational platform, we may discover any type of website here. This makes it a platform for sharing knowledge! --- ## 💻 Tech Stack JavaScript logo HTML5 logo CSS3 logo React.js logo --- ## 🚀 Quick Start Contributions are welcome! If you have any ideas, suggestions, or bug fixes, please open an issue or submit a pull request. Make sure to follow the project's code of conduct. ---

Code of Conduct

Please note that this project is released with a [Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. ## 📦 Installation ### With Docker You can clone the project directly from this repo to your local system. ### 1. Clone the Repo ```bash git clone https://github.com/username/Devlabs.git ``` ### 2. Navigate to the project directory ```bash cd Devlabs ``` ### 3. Create Backend Environment ```bash MONGODB_URI= PORT= FRONTEND_URL= MAIL= PASSWORD= ``` ### 4. Create Frontend Environment All the environment variables for react must be prefixed with `REACT_APP_`. ```bash REACT_APP_BACKEND= ``` ### 5. Run Docker Compose ```bash docker-compose up --build ``` You have to use build for the first time only then you can use `docker-compose up` Now follow all the steps from point 6 of without docker to contribute to the project. ### Without Docker You can clone the project directly from this repo to your local system. ### 1. Clone the Repo ```bash git clone https://github.com/username/Devlabs.git ``` ### 2. Install Dependencies ```bash npm install ``` ### 3. Start Development Server ```bash npm start #or npm run dev ``` ### 4. Create Backend Environment ```bash MONGODB_URI= PORT= FRONTEND_URL= MAIL= PASSWORD= ``` ### 5. Create Frontend Environment All the environment variables for react must be prefixed with `REACT_APP_`. ```bash REACT_APP_BACKEND= ``` ### 6. Create a New Branch ```bash git checkout -b YourBranchName ``` ### 7. Make Your Changes to the Source Code To add a new tool: > Go to **src > DB > `product.json`** & add your code ```bash { productName: "< App_Name >", category: "remote | resume | tweet | ai | ethical | movies | extensions | tools", image: "< Image-Url >", link: "< Link_to_the_website >", description: "< Description of product >" }, ``` - Ensure that your URLs are short. It is recommended to use bitly for URL shortening. - Descriptions should not exceed 10-12 words. ### 8. Stage Your Changes ⚠️ **Make sure** not to commit `package.json` or `package-lock.json` file ⚠️ **Make sure** not to run the commands `git add .` or `git add *` --- Instead, stage your changes for each file/folder specifically. ```bash git add "" ``` ### 9. Commit Your Changes ```bash git commit -m "" ``` ### 10. Push Your Local Commits to the Remote Repository ```bash git push origin YourBranchName ``` ### 11. Create a Pull Request Create a [Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request)!

Are Ready to Contribute?

If you would like to contribute to the project then kindly go through [Contributing Guidelines](CONTRIBUTING.md) to understand everything from setup to necessary instructions.

Let's Collaborate and Make DevLabs Even Better! 💻🌟

✨ Features

1. User Authentication: Secure user registration and login using JWT. OAuth integration for social logins (Google, Facebook). 2. User Profiles: Customizable user profiles. Profile picture upload and bio section. 3. Tool Rating & Reviews Users can rate and review tools. Aggregate ratings for each tool displayed. 4. Favorites & Bookmarking Users can bookmark their favorite tools. Quick access to bookmarked tools from the profile. 5. Tool Categories & Tags Tools categorized for easy browsing. Tagging system for quick filtering and searching. 6. Advanced Search Search tools by name, category, or tags. Filter results by ratings and reviews. 7. Responsive Design Fully responsive design for mobile, tablet, and desktop. 8. Notifications Email notifications for new tools, reviews, and updates. 9. Admin Dashboard Manage users, tools, and reviews. Analytics on tool usage and user engagement. 10. Documentation Comprehensive documentation for developers. API documentation for integrating with other platforms. ### 📚 Learn To know more about project, please go through [Learn](learn.md)
### 🌍 Community

Our Contributors ❤️

Thank you for contributing to our repository


Support

Don't forget to leave a star for this project!

Go to Top ` ================================================ FILE: backend/.dockerignore ================================================ node_modules build .DS_Store .env .git .gitignore ================================================ FILE: backend/.gitignore ================================================ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies /node_modules /.pnp .pnp.js # production /build # misc .DS_Store .env .env.local .env.development.local .env.test.local .env.production.local config.env .vscode npm-debug.log* yarn-debug.log* yarn-error.log* ================================================ FILE: backend/Dockerfile ================================================ FROM node:alpine WORKDIR /app COPY package.json package-lock.json ./ RUN npm install COPY . . EXPOSE 8000 CMD ["npm", "start"] ================================================ FILE: backend/init/sampleToolsData.js ================================================ const mongoose = require("mongoose"); const { connectToDB } = require("../src/config/database"); const Tool = require("../src/models/Tool"); async function db() { try { await connectToDB(); console.log("Database connected!"); const sampleData = [ { productName: "Carousel Hero", category: "tools", image: "https://i.ibb.co/7rRW6TW/logo-social-large.png", link: "https://carouselhero.com", description: "Create social media carousels for free and with no signup.", }, { productName: "PikaShows", category: "movies", image: "https://tinyurl.com/37csr8my", link: "https://www.pikashows.download/", description: "Download this application for PC and Mobile to stream all types of TV Shows and Movies.", }, { productName: "Scaler", category: "coding", image: "https://bit.ly/3XoZKgc", link: "https://bit.ly/3plUFZw", description: "Scaler is an outcome-focused, ed-tech platform for techies.", }, { productName: "InterviewBit", category: "coding", image: "https://bit.ly/3NH8dIt", link: "https://bit.ly/43VBwNf", description: "InterviewBit prepares you not only for the interviews, but for the actual job too.", }, { productName: "Momentum", category: "extensions", image: "https://bit.ly/3JoG8mI", link: "https://bit.ly/3JoG6v6", description: "Replace new tab page with a personal dashboard to help you get focused, stay organized, and keep motivated to achieve your goals.", }, { productName: "ACM", category: "tools", image: "https://avatars.githubusercontent.com/u/65459277?s=200&v=4", link: "https://www.acm.org/", description: "It provides a platform for computing professionals, researchers, educators, and students to exchange ideas and information related to computer science and information technology.", }, ]; const insertedData = await Tool.insertMany(sampleData); console.log("Sample data added successfully!", insertedData); } catch (error) { console.error("Error adding sample data:", error); } finally { mongoose.connection.close(() => { console.log("Database connection closed."); }); } } db(); ================================================ FILE: backend/package.json ================================================ { "name": "devlabs-backend", "version": "1.0.0", "description": "A backend for storing data for devlabs web-application", "main": "server.js", "scripts": { "start": "node server.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.20.2", "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.2", "mongoose": "^7.6.3", "nodemailer": "^6.9.7", "password-hash": "^1.2.2" } } ================================================ FILE: backend/readme.md ================================================ # DevLabs Backend Welcome to the backend of DevLabs, the platform that connects users with a collection of free tools from the open-source community. This backend repository powers the server-side logic and facilitates seamless interactions with the database. ## Tech Stack - Node.js - A JavaScript runtime for server-side development. - Express.js - A minimal and flexible Node.js web application framework. - MongoDB - A NoSQL database for storing tool data. - Mongoose - An ODM (Object Data Modeling) library for MongoDB and Node.js. ## Installation 1. Clone the repository: ```bash git clone https://github.com/username/Devlabs-backend.git ### 2. Install Dependencies ```bash npm install ` ### 3. Start development Server ```bash npm start ``` ### 3. Create Backend Environment ```bash MONGODB_URI= PORT= FRONTEND_URL= MAIL= PASSWORD= ``` ### 4. Create Frontend Environment All the environment variables for react must be prefixed with `REACT_APP_`. ```bash REACT_APP_BACKEND= ``` ### 5 Create a new branch ```bash git checkout -b YourBranchName ``` ### 6. Make your changes to the source code Add new tool : > Go to **src > DB > `product.json`** & add your code ```bash { productName: "< App_Name >", category: "remote | resume | tweet | ai | ethical | movies | extensions | tools", image: "< Image-Url >", link: "< Link_to_the_website >", description: "< Description of product >" }, ``` To ensure that your URLs are short, it is recommended to use bitly for URL shortening. Description should not exceed 10-12 words ### 7. Stage your changes ⚠️ **Make sure** not to commit `package.json` or `package-lock.json` file ⚠️ **Make sure** not to run the commands `git add .` or `git add *` > Instead, stage your changes for each file/folder > > By using public path it means it will add all files and folders under that folder, it is better to be specific ```bash git add "" ``` ### 8. Commit your changes ```bash git commit -m "" ``` ### 9. Push your local commits to the remote repository ```bash git push origin YourBranchName ``` **10.** Create a [Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request)! ================================================ FILE: backend/server.js ================================================ const app = require("./src/app"); const { connectToDB } = require("./src/config/database"); const port = process.env.PORT || 8000; app.listen(port, async () => { await connectToDB(); console.log(`Application running on http://localhost:${port}\n`); }) ================================================ FILE: backend/src/app.js ================================================ const bodyParser = require("body-parser"); const cors = require("cors"); const express = require("express"); const app = express(); require("dotenv").config(); app.use("/public", express.static("public")); app.use(bodyParser.json({ limit: "50mb" })); app.use(bodyParser.urlencoded({ extended: true, limit: "50mb" })); app.use( cors({ origin: 'http://localhost:3000', credentials: true, }) ); app.get("/", async (req, res) => { return res.status(200).json({ message: "Welcome to DevLabs Backend!" }); }); app.use("/special", require("./routes/special")); app.use("/tools", require("./routes/tools")); app.use("/open-source", require("./routes/openSource")); app.use("/users", require("./routes/user")); module.exports = app; ================================================ FILE: backend/src/config/ExpressError.js ================================================ class ExpressError extends Error{ constructor(status,message){ super() this.status = status this.message = message } } module.exports = ExpressError ================================================ FILE: backend/src/config/database.js ================================================ const mongoose = require("mongoose"); require("dotenv").config(); const DB_URI = process.env.MONGODB_URI || "mongodb://0.0.0.0:27017" const connectToDB = async () => { try { await mongoose.connect(DB_URI, { useNewUrlParser: true, useUnifiedTopology: true, }); console.log("Connected to MongoDB !"); } catch (error) { console.log("MongoDB Connection Error"); console.log(error); } } module.exports = {connectToDB}; ================================================ FILE: backend/src/config/nodemailer.js ================================================ const nodemailer = require("nodemailer"); require("dotenv").config(); const transporter = nodemailer.createTransport({ service: "gmail", auth:{ user: process.env.EMAIL, pass: process.env.PASSWORD } }); const mailOptions = (email) => { return { from: process.env.EMAIL, to: email, bcc: process.env.EMAIL }; }; module.exports = {transporter, mailOptions} ================================================ FILE: backend/src/controllers/openSourceController.js ================================================ const OpenSource = require("../models/OpenSource"); require("dotenv").config(); const addProject = async (req, res) => { try { const { projectName, ownerUsername, tags, link, description } = req.body; // Validation if (!projectName || !ownerUsername || !link || !description) { return res.status(400).json({ success: false, errors: ["All fields are required"] }); } const newProject = new OpenSource({ projectName, ownerUsername, tags, link, description }); await newProject.save(); return res.status(201).json({ success: true, project: newProject }); } catch (error) { console.error(error); return res.status(500).json({ success: false, errors: ["Internal Server Error"] }); } }; const fetchAllProjects = async (req, res) => { try { const { page = 1, limit = 10 } = req.query; const openSourceProjects = await OpenSource.find() .skip((page - 1) * limit) .limit(parseInt(limit)); const totalProjects = await OpenSource.countDocuments(); return res.status(200).json({ success: true, openSourceProjects, totalPages: Math.ceil(totalProjects / limit), currentPage: parseInt(page) }); } catch (error) { console.error(error); return res.status(500).json({ success: false, errors: ["Internal Server Error"] }); } }; module.exports = { addProject, fetchAllProjects }; ================================================ FILE: backend/src/controllers/specialController.js ================================================ const mongoose = require("mongoose") const reviewForm = require("../models/reviewForm"); const {transporter, mailOptions} = require("../config/nodemailer"); const capitalize = (word) => { return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); } const generateEmailText = (data) => { const text = Object.entries(data).reduce((str, [key, value]) => { return str += `${capitalize(key)}: \n${value}\n\n`; }, ""); return text; } const generateEmailBody = ({name, email, review}) => { const html = `

Message from ${name}

Email: ${email}

Message:

${review}

`; return html; } const sendMail = async (req, res) => { try{ const { name, email, review } = req.body; if (!name || !email || !review) return res.status(400).json({ success:false, errors: ["Missing Data"] }); await transporter.sendMail({ ...mailOptions(email), subject: `${name} CONTACTING THROUGH PORTFOLIO`, text: generateEmailText({ name, email, review }), html: generateEmailBody({ name, email, review }) }); const newReview = new reviewForm({ name, email, msg: review, }); console.log(newReview) try { await newReview.save(); //console.log("SAVED DATA") } catch (error) { //console.log("ERROR IS SAVING DATA") } return res.status(200).json({ success: true }); } catch (error) { console.log(error); return res.status(500).json({ success: false, errors: ["Internal Server Error"] }); } }; module.exports = { sendMail }; ================================================ FILE: backend/src/controllers/toolController.js ================================================ const Tool = require("../models/Tool"); require("dotenv").config(); const addTool = async (req, res) => { try { const {productName, category, image, link, description} = req.body; const newTool = await Tool.create({ productName, category, image, link, description }) if (!newTool) return res.statsu(401).json({ success: false, errors: ["Issue Adding the Tool"] }); return res.status(201).json({ success: true }); } catch (error) { console.log(error); return res.status(500).json({ success: false, errors: ["Internal Server Error"] }); } } const fetchAllTools = async (req, res) => { try{ const tools = await Tool.find(); return res.status(200).json({ success: true, tools: tools }); } catch (error) { console.log(error); return res.status(500).json({ success: false, errors: ["Internal Server Error"] }); } } module.exports = { addTool, fetchAllTools }; ================================================ FILE: backend/src/controllers/userController.js ================================================ const User = require("../models/User"); const passwordHash = require("password-hash"); const jwt = require("jsonwebtoken"); const ExpressError = require("../config/ExpressError"); const Tool = require("../models/Tool"); require("dotenv").config(); const newUser = async (req, res) => { try { const { name, username, password } = req.body; if (!password || typeof password !== 'string' || password.trim().length === 0) { return res.status(400).json({ error: 'Invalid password' }); } const hashedPassword = passwordHash.generate(password); const newData = new User({ name: name, username: username, password: hashedPassword, }); await newData.save(); let token = jwt.sign( { username: username, }, process.env.JWT_PASS ); res.send(token); } catch (err) { console.log(err); return res .status(500) .json({ success: false, errors: ["Internal Server Error"] }); } }; const signIn = async (req, res) => { try { const { username, password } = req.body; const findUser = await User.findOne({ username: username }); if (findUser != null) { let storedPassword = findUser.password; if (passwordHash.verify(password, storedPassword)) { let token = jwt.sign( { username: username, }, process.env.JWT_PASS ); res.send(token); } else { throw new ExpressError(403, "Wrong Password!"); } } else { throw new ExpressError(404, "Username not found!"); } } catch (err) { console.log(err); return res .status(500) .json({ success: false, errors: ["Internal Server Error"] }); } }; const addBookmark = async (req, res) => { try { const { username, id } = req.body; //id of tool which is being bookmarked let findUser = await User.findOne({ username: username }); if (findUser != null) { let findTool = await Tool.findById(id); if (findTool != null) { findUser.bookmarks.push(findTool); await findUser.save(); res.send("Bookmark added!"); } else { throw new ExpressError(404, "Tool not found!"); } } else { throw new ExpressError(404, "User not found!"); } } catch (err) { console.log(err); return res .status(500) .json({ success: false, errors: ["Internal Server Error"] }); } }; module.exports = { newUser, signIn, addBookmark }; ================================================ FILE: backend/src/models/OpenSource.js ================================================ const mongoose = require("mongoose"); const OpenSourceSchema = new mongoose.Schema({ projectName: { type: String, required: true, }, ownerUsername: { type: String, required: true, }, tags: { type: [String], required: true }, link: { type: String, required: true, unique: true }, description: { type: String, required: true } }); module.exports = mongoose.model("openSource", OpenSourceSchema); ================================================ FILE: backend/src/models/Tool.js ================================================ const mongoose = require("mongoose"); const ToolSchema = new mongoose.Schema({ productName: { type: String, required: true }, category: { type: String, enum: ['remote', 'resume', 'tweet', 'ai', 'ethical', 'movies', 'extensions', 'tools','coding', 'productivity','collaboration'], required: true }, image: { type: String, required: true }, link: { type: String, required: true, unique: true }, description: { type: String, required: true } }); module.exports = mongoose.model("Tool", ToolSchema); ================================================ FILE: backend/src/models/User.js ================================================ const mongoose = require("mongoose"); const userSchema = new mongoose.Schema({ name: { type: String, required: true, }, username: { type: String, required: true, unique: true, }, password: { type: String, required: true, }, bookmarks:[ { type:mongoose.Schema.Types.ObjectId, ref:"Tool" } ] }); const User = mongoose.model("User",userSchema) module.exports = User ================================================ FILE: backend/src/models/reviewForm.js ================================================ const mongoose = require("mongoose"); const reviewFormSchema = new mongoose.Schema({ name: { type: String, required: true, }, email: { type: String, required: true, }, msg: { type: String, required: true } }); module.exports = mongoose.model("reviewForm", reviewFormSchema); ================================================ FILE: backend/src/routes/openSource.js ================================================ const express = require("express"); const router = express.Router(); const openSourceController = require("../controllers/openSourceController"); router.post("/add", openSourceController.addProject); router.get("/all", openSourceController.fetchAllProjects); module.exports = router; ================================================ FILE: backend/src/routes/special.js ================================================ const express = require("express"); const router = express.Router(); require("dotenv").config(); const specialController = require("../controllers/specialController"); router.post("/mail", specialController.sendMail); module.exports = router; ================================================ FILE: backend/src/routes/tools.js ================================================ const express = require("express"); const router = express.Router(); const toolController = require("../controllers/toolController"); router.post("/add", toolController.addTool); router.get("/all", toolController.fetchAllTools); module.exports = router; ================================================ FILE: backend/src/routes/user.js ================================================ const express = require("express"); const { newUser, signIn, addBookmark, } = require("../controllers/userController"); const router = express.Router(); router.post("/signup", newUser); router.post("/signin", signIn); router.post("/new/bookmark", addBookmark); router.use((err, req, res, next) => { let { status = 500, message = "Some error occured..!" } = err; res.status(status).send(message); }); module.exports = router; ================================================ FILE: backend/vercel.json ================================================ { "version": 2, "builds": [ { "src": "server.js", "use": "@vercel/node" } ], "routes": [ { "src": "/(.*)", "dest": "server.js" } ], "public": true } ================================================ FILE: docker-compose.yaml ================================================ version: '3.8' services: devlab-frontend: build: context: ./frontend ports: - "3000:3000" env_file: - ./frontend/.env devlab-backend: build: context: ./backend ports: - "8000:8000" env_file: - ./backend/.env depends_on: - mongo mongo: image: mongo:latest ports: - "27017:27017" volumes: - mongo-data:/data/db volumes: mongo-data: ================================================ FILE: frontend/.dockerignore ================================================ node_modules build .DS_Store .env .git .gitignore ================================================ FILE: frontend/.gitignore ================================================ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies /node_modules /.pnp .pnp.js # testing /coverage # production /build # misc .DS_Store .env .env.local .env.development.local .env.test.local .env.production.local .github .vscode npm-debug.log* yarn-debug.log* yarn-error.log* ================================================ FILE: frontend/Dockerfile ================================================ # Build stage FROM node:alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm install COPY . . RUN npm run build # Production stage FROM node:alpine WORKDIR /app COPY --from=builder /app/build /app/build COPY --from=builder /app/package.json /app/package-lock.json /app/ RUN npm install --only=production EXPOSE 3000 CMD ["npx", "serve", "-s", "build"] ================================================ FILE: frontend/package.json ================================================ { "name": "myapp", "version": "0.1.0", "private": true, "dependencies": { "@babel/plugin-transform-class-properties": "^7.21.0", "@babel/plugin-transform-nullish-coalescing-operator": "^7.21.0", "@babel/plugin-transform-numeric-separator": "^7.21.0", "@babel/plugin-transform-optional-chaining": "^7.21.0", "@babel/plugin-transform-private-methods": "^7.21.0", "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", "@fortawesome/free-brands-svg-icons": "^6.6.0", "@fortawesome/free-solid-svg-icons": "^6.6.0", "@fortawesome/react-fontawesome": "^0.2.2", "@mui/material": "^5.16.4", "@mui/styled-engine-sc": "^6.0.0-alpha.18", "@reduxjs/toolkit": "^2.2.6", "@rollup/plugin-terser": "^0.4.4", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "antd": "^5.19.3", "aos": "^2.3.4", "axios": "^1.7.2", "bootstrap": "^5.3.3", "cheerio": "^1.0.0-rc.12", "darkmode-js": "^1.5.7", "dotenv": "^16.4.5", "express": "^4.19.2", "lottie-react": "^2.4.0", "mongodb": "^6.8.0", "pagination": "^0.4.6", "react": "^18.3.1", "react-accessible-accordion": "^5.0.0", "react-chatbot-kit": "^2.2.2", "react-dom": "^18.3.1", "react-hot-toast": "^2.4.1", "react-icons": "^5.2.1", "react-loading-skeleton": "^3.4.0", "react-paginate": "^8.2.0", "react-parallax-tilt": "^1.7.232", "react-redux": "^9.1.2", "react-router-dom": "^6.25.1", "react-scripts": "^5.0.1", "react-spinners": "^0.14.1", "react-toastify": "^10.0.5", "run": "^1.5.0", "styled-components": "^6.1.12", "web-vitals": "^4.2.2" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": [ "react-app", "react-app/jest" ] }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, "resolutions": { "jest": "28.0.0" } } ================================================ FILE: frontend/public/index.html ================================================ DEVLABS
================================================ FILE: frontend/public/manifest.json ================================================ { "short_name": "React App", "name": "Create React App Sample", "icons": [ { "src": "favicon.ico", "sizes": "128x128 64x64 32x32 24x24 16x16", "type": "image/x-icon" }, { "src": "logo192.png", "type": "image/png", "sizes": "192x192" }, { "src": "logo512.png", "type": "image/png", "sizes": "512x512" } ], "start_url": ".", "display": "standalone", "theme_color": "#000000", "background_color": "#ffffff" } ================================================ FILE: frontend/public/robots.txt ================================================ # https://www.robotstxt.org/robotstxt.html User-agent: * Disallow: ================================================ FILE: frontend/src/App.css ================================================ .sidebar-content { padding: 10px; cursor: pointer; transition: background-color 0.2s; } /* cursor: pointer; transition: background-color 0.2s; } }}}} */ ================================================ FILE: frontend/src/App.js ================================================ import React, { useState, useEffect, lazy, Suspense } from "react"; import { Route, Routes } from "react-router-dom"; import "./App.css"; import AOS from "aos"; import "aos/dist/aos.css"; import { Toaster } from "react-hot-toast"; // Normal imports for components always needed import Navbar from "./Component/Navbar/Navbar"; import Footer from "./Component/Footer"; import BackToTopButton from "./Component/BackToTopButton"; import ScrollToTop from "./Component/ScrollToTop"; import ChatAssistant from "./ChatAssistant/ChatAssistant"; // Lazy load components for pages and rarely changed components const About = lazy(() => import("./Component/About")); const Rateus = lazy(() => import("./Component/Rateus")); const Home = lazy(() => import("./Component/Home")); const NotFound = lazy(() => import("./Component/NotFound")); const OpenSource = lazy(() => import("./Component/OpenSource")); const Review = lazy(() => import("./Component/Review")); const BookMark = lazy(() => import("./Component/BookMark")); const Contact = lazy(() => import("./Component/Contact")); const Signup = lazy(() => import("./Component/Signup")); const Profile = lazy(() => import("./Component/Profile")); const RemoteJobs = lazy(() => import("./pages/RemoteJobs")); const AI = lazy(() => import("./pages/AI")); const UI = lazy(() => import("./pages/UI")); const Movie = lazy(() => import("./pages/Movie")); const Extension = lazy(() => import("./pages/Extension")); const EthicalHacking = lazy(() => import("./pages/EthicalHacking")); const FrontendTools = lazy(() => import("./pages/FrontendTools")); const Faq = lazy(() => import("./Component/Faq")); const CodingPlatform = lazy(() => import("./pages/CodingPlatform")); const CoursesPlatform = lazy(() => import("./pages/CoursesPlatform")); const Collaboration = lazy(() => import("./pages/Collaboration")); const Productivity = lazy(() => import("./pages/Productivity")); const Extensions = lazy(() => import("./pages/Extensions")); const Movies = lazy(() => import("./pages/Movies")); const Ui = lazy(() => import("./pages/UserInterface")); const RemoteJob = lazy(() => import("./pages/RemoteJob")); function App() { const [searchQuery, setSearchQuery] = useState(""); useEffect(() => { AOS.init(); }, []); return ( <> Loading...}> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* 404 route */}