├── .github └── workflows │ └── e2e.yml ├── .gitignore ├── .npmrc ├── .travis.yml ├── CNAME ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── angular.json ├── browserslist ├── e2e ├── protractor.conf.js ├── src │ ├── app.e2e-spec.ts │ ├── app.po.ts │ ├── trending.e2e-spec.ts │ └── trending.po.ts └── tsconfig.json ├── karma.conf.js ├── package-lock.json ├── package.json ├── renovate.json ├── src ├── app │ ├── about │ │ ├── about.component.html │ │ ├── about.component.scss │ │ ├── about.component.spec.ts │ │ └── about.component.ts │ ├── app-routing.module.ts │ ├── app.component.html │ ├── app.component.scss │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── developer │ │ ├── developer.component.html │ │ ├── developer.component.scss │ │ ├── developer.component.spec.ts │ │ └── developer.component.ts │ ├── home │ │ ├── home.component.html │ │ ├── home.component.scss │ │ ├── home.component.spec.ts │ │ └── home.component.ts │ ├── model │ │ ├── developer.ts │ │ ├── language.ts │ │ └── repository.ts │ └── service │ │ ├── trending.service.spec.ts │ │ └── trending.service.ts ├── assets │ ├── .gitkeep │ └── icons │ │ ├── icon-128x128.png │ │ ├── icon-144x144.png │ │ ├── icon-152x152.png │ │ ├── icon-192x192.png │ │ ├── icon-384x384.png │ │ ├── icon-512x512.png │ │ ├── icon-72x72.png │ │ └── icon-96x96.png ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── index.html ├── main.ts ├── manifest.webmanifest ├── polyfills.ts ├── pwabuilder-sw.js ├── styles.scss ├── test.ts └── themes.scss ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.spec.json └── tslint.json /.github/workflows/e2e.yml: -------------------------------------------------------------------------------- 1 | name: E2E Test 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | strategy: 11 | matrix: 12 | node-version: [ 18.x ] 13 | 14 | steps: 15 | - uses: actions/checkout@v1 16 | - name: Use Node.js ${{ matrix.node-version }} 17 | uses: actions/setup-node@v1 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | - name: npm install, and e2e test 21 | run: | 22 | npm ci 23 | npm run webdriver-update 24 | npm run e2e 25 | env: 26 | CI: true 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.angular/cache 2 | /dist 3 | /tmp 4 | /bazel-out 5 | /node_modules 6 | /libpeerconnection.log 7 | npm-debug.log 8 | chrome-profiler-events*.json 9 | speed-measure-plugin*.json 10 | .classpath 11 | .vscode/* 12 | !.vscode/settings.json 13 | !.vscode/tasks.json 14 | !.vscode/launch.json 15 | !.vscode/extensions.json 16 | .history/* 17 | .c9/ 18 | .project 19 | yarn-error.log 20 | testem.log 21 | .now 22 | .github 23 | /typings 24 | /.sass-cache 25 | /connect.lock 26 | /coverage 27 | /out-tsc 28 | .env 29 | 30 | 31 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "stable" 4 | matrix: 5 | include: 6 | - os: linux 7 | dist: trusty 8 | sudo: required 9 | cache: 10 | directories: 11 | - node_modules 12 | script: 13 | - ng build --prod --base-href "https://hyraze.github.io/gitrepos" 14 | deploy: 15 | provider: pages 16 | skip_cleanup: true 17 | github_token: $github_token 18 | local_dir: dist 19 | fqdn: hyraze.github.io/gitrepos 20 | on: 21 | branch: master 22 | after_script: 23 | - bash -c "$(curl -fsSL https://raw.githubusercontent.com/MaT1g3R/travis_discord/master/travis.sh)" 24 | 25 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | gitrepos.xyz 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | - Using welcoming and inclusive language 18 | - Being respectful of differing viewpoints and experiences 19 | - Gracefully accepting constructive criticism 20 | - Focusing on what is best for the community 21 | - Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | - The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | - Trolling, insulting/derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | - Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at hanishrao@protonmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Welcome to Gitrepos 👋

2 |
3 |
4 | hero image 5 |
6 |
7 |

:octocat: A simple PWA app that returns Trending Repositories & Developers from GitHub, Gitlab & HackerNews.

8 | 9 | [![E2E Test](https://github.com/Hyraze/gitrepos/workflows/E2E%20Test/badge.svg?branch=master)](https://github.com/Hyraze/gitrepos/workflows/E2E) 10 | [![Build Status](https://travis-ci.org/Hyraze/gitrepos.svg?branch=master)](https://travis-ci.org/Hyraze/gitrepos) 11 | [![GitHub license](https://img.shields.io/badge/license-GPL-blue.svg)](https://github.com/Hyraze/gitrepos/blob/master/LICENSE) 12 | [![Code of Conduct](https://img.shields.io/badge/code%20of-conduct-ff69b4.svg)](CODE_OF_CONDUCT.md) 13 | 14 | ### 🏠 [Homepage](https://github.com/Hyraze/gitrepos#readme) 15 | 16 | 17 | ### ✨ [Demo](https://gitrepos.now.sh/) 18 | 19 | 20 | ## Prerequisites 21 | - Angular 22 | 23 | 24 | ## Further help 25 | To get more help on the Angular CLI use ng help or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). 26 | 27 | 28 | ## 🤝 Contributing 29 | Contributions, issues and feature requests are welcome!
Feel free to check [issues page](https://github.com/Hyraze/feedgator/issues). 30 | * [Development Branch](https://github.com/Hyraze/gitrepos/tree/master-dev) 31 | 32 | 33 | ## Show your support 34 | Give a ⭐️ if this project helped you! 35 | 36 | 37 | ## Goals 38 | * [Roadmap](https://gist.githubusercontent.com/Hyraze/2eb4542b79fd73507c6011eff40e0034/raw/102fae0d55080cc353e77376c9a9cd0068608cda/gitrepogoals.md) 39 | 40 | 41 | ## Credits 42 | * [Github Trending API](https://github.com/huchenme/github-trending-api) 43 | * [stargit](https://stargit.xyz/) 44 | * [Nebular](https://akveo.github.io/nebular) 45 | 46 | 47 | ## 📝 License 48 | #### GNU General Public License v2.0 License 49 | Copyright (c) 2020 Hanishraj B Rao 50 | 51 | This program is free software; you can redistribute it and/or modify it under the terms 52 | of the GNU General Public License as published by the Free Software Foundation; either 53 | version 2 of the License, or (at your option) any later version: 54 | 55 | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 56 | See the GNU General Public License for more details 57 | 58 | -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "gitrepos": { 7 | "projectType": "application", 8 | "schematics": { 9 | "@schematics/angular:component": { 10 | "style": "scss" 11 | } 12 | }, 13 | "root": "", 14 | "sourceRoot": "src", 15 | "prefix": "app", 16 | "architect": { 17 | "build": { 18 | "builder": "@angular-devkit/build-angular:browser", 19 | "options": { 20 | "outputPath": "dist/", 21 | "index": "src/index.html", 22 | "main": "src/main.ts", 23 | "polyfills": "src/polyfills.ts", 24 | "tsConfig": "tsconfig.app.json", 25 | "aot": true, 26 | "assets": [ 27 | "src/favicon.ico", 28 | "src/assets", 29 | "src/manifest.webmanifest", 30 | "src/pwabuilder-sw.js" 31 | ], 32 | "styles": [ 33 | "src/styles.scss" 34 | ], 35 | "scripts": [] 36 | }, 37 | "configurations": { 38 | "production": { 39 | "fileReplacements": [ 40 | { 41 | "replace": "src/environments/environment.ts", 42 | "with": "src/environments/environment.prod.ts" 43 | } 44 | ], 45 | "optimization": true, 46 | "outputHashing": "all", 47 | "sourceMap": false, 48 | "namedChunks": false, 49 | "aot": true, 50 | "extractLicenses": true, 51 | "vendorChunk": false, 52 | "buildOptimizer": true, 53 | "budgets": [ 54 | { 55 | "type": "initial", 56 | "maximumWarning": "2mb", 57 | "maximumError": "5mb" 58 | }, 59 | { 60 | "type": "anyComponentStyle", 61 | "maximumWarning": "6kb", 62 | "maximumError": "10kb" 63 | } 64 | ], 65 | "serviceWorker": false 66 | 67 | } 68 | } 69 | }, 70 | "serve": { 71 | "builder": "@angular-devkit/build-angular:dev-server", 72 | "options": { 73 | "browserTarget": "gitrepos:build" 74 | }, 75 | "configurations": { 76 | "production": { 77 | "browserTarget": "gitrepos:build:production" 78 | } 79 | } 80 | }, 81 | "extract-i18n": { 82 | "builder": "@angular-devkit/build-angular:extract-i18n", 83 | "options": { 84 | "browserTarget": "gitrepos:build" 85 | } 86 | }, 87 | "test": { 88 | "builder": "@angular-devkit/build-angular:karma", 89 | "options": { 90 | "main": "src/test.ts", 91 | "polyfills": "src/polyfills.ts", 92 | "tsConfig": "tsconfig.spec.json", 93 | "karmaConfig": "karma.conf.js", 94 | "assets": [ 95 | "src/favicon.ico", 96 | "src/assets", 97 | "src/manifest.webmanifest" 98 | ], 99 | "styles": [ 100 | "src/styles.scss" 101 | ], 102 | "scripts": [] 103 | } 104 | }, 105 | "e2e": { 106 | "builder": "@angular-devkit/build-angular:protractor", 107 | "options": { 108 | "protractorConfig": "e2e/protractor.conf.js", 109 | "devServerTarget": "gitrepos:serve" 110 | }, 111 | "configurations": { 112 | "production": { 113 | "devServerTarget": "gitrepos:serve:production" 114 | } 115 | } 116 | }, 117 | "deploy": { 118 | "builder": "@zeit/ng-deploy:deploy" 119 | } 120 | } 121 | } 122 | }, 123 | "cli": { 124 | "analytics": false 125 | } 126 | } -------------------------------------------------------------------------------- /browserslist: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # You can see what browsers were selected by your queries by running: 6 | # npx browserslist 7 | 8 | > 0.5% 9 | last 2 versions 10 | Firefox ESR 11 | not dead 12 | not IE 9-11 # For IE 9-11 support, remove 'not'. -------------------------------------------------------------------------------- /e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Protractor configuration file, see link for more information 3 | // https://github.com/angular/protractor/blob/master/lib/config.ts 4 | 5 | const { SpecReporter } = require('jasmine-spec-reporter'); 6 | 7 | /** 8 | * @type { import("protractor").Config } 9 | */ 10 | exports.config = { 11 | allScriptsTimeout: 11000, 12 | specs: [ 13 | './src/**/*.e2e-spec.ts' 14 | ], 15 | capabilities: { 16 | chromeOptions: { 17 | args: [ "--headless" ] 18 | }, 19 | 'browserName': 'chrome' 20 | }, 21 | directConnect: true, 22 | baseUrl: 'http://localhost:4200/', 23 | framework: 'jasmine', 24 | jasmineNodeOpts: { 25 | showColors: true, 26 | defaultTimeoutInterval: 30000, 27 | print: function() {} 28 | }, 29 | onPrepare() { 30 | require('ts-node').register({ 31 | project: require('path').join(__dirname, './tsconfig.json') 32 | }); 33 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | import { browser, logging } from 'protractor'; 3 | 4 | describe('gitrepos App', () => { 5 | let page: AppPage; 6 | 7 | beforeEach(() => { 8 | page = new AppPage(); 9 | }); 10 | 11 | it('should display Home Title', () => { 12 | page.navigateTo(); 13 | expect(page.getTitleText()).toEqual('Gitrepos'); 14 | }); 15 | 16 | afterEach(async () => { 17 | // Assert that there are no errors emitted from the browser 18 | const logs = await browser.manage().logs().get(logging.Type.BROWSER); 19 | expect(logs).not.toContain(jasmine.objectContaining({ 20 | level: logging.Level.SEVERE, 21 | } as logging.Entry)); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get(browser.baseUrl) as Promise; 6 | } 7 | 8 | getTitleText() { 9 | return element(by.css('nb-layout-header .title')).getText() as Promise; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /e2e/src/trending.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { TrendingPage } from './trending.po'; 2 | describe('gitrepos trending view', () => { 3 | let page: TrendingPage; 4 | 5 | beforeEach(() => { 6 | page = new TrendingPage(); 7 | }); 8 | 9 | it('should show a repo name', () => { 10 | page.navigateTo(); 11 | expect(page.getRepoName().getText()).toBeDefined(); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /e2e/src/trending.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class TrendingPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getPageHeaderText() { 9 | return element(by.tagName('h1')); 10 | } 11 | 12 | getSinceSelector() { 13 | return element(by.css('.since')); 14 | } 15 | 16 | getDaily() { 17 | const since = this.getSinceSelector(); 18 | since.click(); 19 | return element(by.css('.daily')); 20 | } 21 | 22 | getMonthly() { 23 | const since = this.getSinceSelector(); 24 | since.click(); 25 | return element(by.css('.monthly')); 26 | } 27 | 28 | getRepoName() { 29 | return element(by.css('.repoName')); 30 | } 31 | 32 | getStarCount() { 33 | return element(by.css('.starCount')); 34 | } 35 | 36 | getRepoCardElements() { 37 | return element.all(by.css('.repoCards')); 38 | } 39 | 40 | getDailyCardElements() { 41 | const daily = this.getDaily(); 42 | daily.click(); 43 | return this.getRepoCardElements(); 44 | } 45 | 46 | getMonthlyRepoCardElements() { 47 | const monthly = this.getMonthly(); 48 | monthly.click(); 49 | return this.getRepoCardElements(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "jasminewd2", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, './coverage/gitrepos'), 20 | reports: ['html', 'lcovonly', 'text-summary'], 21 | fixWebpackSourcePaths: true 22 | }, 23 | reporters: ['progress', 'kjhtml'], 24 | port: 9876, 25 | colors: true, 26 | logLevel: config.LOG_INFO, 27 | autoWatch: true, 28 | browsers: ['Chrome'], 29 | singleRun: false, 30 | restartOnFileChange: true 31 | }); 32 | }; 33 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitrepos", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "now-build": "ng build --optimization", 9 | "test": "ng test", 10 | "lint": "ng lint", 11 | "e2e": "ng e2e --webdriver-update=false", 12 | "webdriver-update": "webdriver-manager update --versions.chrome=$(google-chrome-stable --version | cut -d ' ' -f 3)" 13 | }, 14 | "private": true, 15 | "dependencies": { 16 | "@angular/animations": "^15.2.0", 17 | "@angular/cdk": "^15.2.0", 18 | "@angular/common": "^15.2.0", 19 | "@angular/compiler": "^15.2.0", 20 | "@angular/core": "^15.2.0", 21 | "@angular/forms": "^15.2.0", 22 | "@angular/platform-browser": "^15.2.0", 23 | "@angular/platform-browser-dynamic": "^15.2.0", 24 | "@angular/pwa": "^15.2.0", 25 | "@angular/router": "^15.2.0", 26 | "@angular/service-worker": "^15.2.0", 27 | "@fortawesome/angular-fontawesome": "^0.12.1", 28 | "@fortawesome/fontawesome-svg-core": "^6.3.0", 29 | "@fortawesome/free-brands-svg-icons": "^6.3.0", 30 | "@fortawesome/free-regular-svg-icons": "^6.3.0", 31 | "@fortawesome/free-solid-svg-icons": "^6.3.0", 32 | "@nebular/eva-icons": "^10.0.0", 33 | "@nebular/theme": "^10.0.0", 34 | "@ngx-progressbar/core": "5.3.2", 35 | "@ngx-progressbar/http": "5.3.2", 36 | "@types/node-fetch": "^2.6.2", 37 | "@zeit/ng-deploy": "0.3.0", 38 | "angular-fontawesome": "1.0.0", 39 | "eva-icons": "1.1.3", 40 | "font-awesome": "4.7.0", 41 | "ngx-spinner": "^15.0.1", 42 | "node-fetch": "^3.3.0", 43 | "npm-check-updates": "^16.7.10", 44 | "rxjs": "^7.8.0", 45 | "tslib": "^2.5.0", 46 | "zone.js": "^0.13.0" 47 | }, 48 | "devDependencies": { 49 | "@angular-devkit/build-angular": "^15.2.0", 50 | "@angular/cli": "^15.2.0", 51 | "@angular/compiler-cli": "^15.2.0", 52 | "@angular/language-service": "^15.2.0", 53 | "@schematics/angular": "^15.2.0", 54 | "@types/jasmine": "^4.3.1", 55 | "@types/jasminewd2": "2.0.10", 56 | "@types/node": "^18.14.2", 57 | "angular-cli-ghpages": "1.0.7", 58 | "codelyzer": "^6.0.2", 59 | "jasmine-core": "^5.0.0", 60 | "jasmine-spec-reporter": "^7.0.0", 61 | "karma": "^6.4.1", 62 | "karma-chrome-launcher": "3.1.1", 63 | "karma-coverage-istanbul-reporter": "3.0.3", 64 | "karma-jasmine": "^5.1.0", 65 | "karma-jasmine-html-reporter": "2.0.0", 66 | "vercel": "^21.0.0", 67 | "protractor": "7.0.0", 68 | "sw-precache-webpack-plugin": "1.0.0", 69 | "ts-node": "^10.9.1", 70 | "tslint": "^6.1.3", 71 | "typescript": "~5.2.0" 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /src/app/about/about.component.html: -------------------------------------------------------------------------------- 1 |

About

2 |

3 | Gitrepos : Trending repositories from GitHub, Gitlab & HackerNews 4 | Copyright (C) 2020 Hanishraj B Rao 5 | 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 |

17 | Future Goals 18 | -------------------------------------------------------------------------------- /src/app/about/about.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/app/about/about.component.scss -------------------------------------------------------------------------------- /src/app/about/about.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AboutComponent } from './about.component'; 4 | 5 | describe('AboutComponent', () => { 6 | let component: AboutComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ AboutComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(AboutComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/about/about.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-about', 5 | templateUrl: './about.component.html', 6 | styleUrls: ['./about.component.scss'] 7 | }) 8 | export class AboutComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | import { HomeComponent } from './home/home.component'; 4 | import { DeveloperComponent } from './developer/developer.component'; 5 | import { AboutComponent } from './about/about.component'; 6 | 7 | const routes: Routes = [ 8 | { path: '', component: HomeComponent }, 9 | // { path: '', redirectTo: '/trending', pathMatch: 'full' }, 10 | // { path: 'trending', component: HomeComponent }, 11 | { path: 'developer', component: DeveloperComponent }, 12 | { path: 'about', component: AboutComponent }, 13 | ]; 14 | 15 | @NgModule({ 16 | imports: [RouterModule.forRoot(routes)], 17 | exports: [RouterModule], 18 | }) 19 | export class AppRoutingModule {} 20 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 16 | 29 | 32 | 33 | 34 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | Made with  by Hyraze 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | @import "../themes.scss"; 2 | 3 | @include nb-install-component { 4 | 5 | background: nb-theme(background-basic-color); 6 | } 7 | 8 | 9 | nb-layout-header { 10 | position: relative; 11 | display: block; 12 | } 13 | 14 | 15 | .sidebar-toggle { 16 | border: none; 17 | background-color: rgba(0, 0, 0, 0); 18 | font-size: 2.5rem; 19 | line-height: 1rem; 20 | outline:none; 21 | } 22 | 23 | .sidebar-toggle-icon { 24 | vertical-align: middle; 25 | font-size: 1.75rem; 26 | color: rgb(137, 148, 163); 27 | } 28 | .title { 29 | font-size: 2.5em; 30 | margin-left: 5px; 31 | flex: 1; 32 | font-family: nb-theme(font-family-primary); 33 | display: inline-block; 34 | color:color-primary-600; /*non-webkit fallback*/ 35 | } 36 | 37 | -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, async } from '@angular/core/testing'; 2 | import { RouterTestingModule } from '@angular/router/testing'; 3 | import { AppComponent } from './app.component'; 4 | 5 | describe('AppComponent', () => { 6 | beforeEach(async(() => { 7 | TestBed.configureTestingModule({ 8 | imports: [ 9 | RouterTestingModule 10 | ], 11 | declarations: [ 12 | AppComponent 13 | ], 14 | }).compileComponents(); 15 | })); 16 | 17 | it('should create the app', () => { 18 | const fixture = TestBed.createComponent(AppComponent); 19 | const app = fixture.debugElement.componentInstance; 20 | expect(app).toBeTruthy(); 21 | }); 22 | 23 | it(`should have as title 'gitrepos'`, () => { 24 | const fixture = TestBed.createComponent(AppComponent); 25 | const app = fixture.debugElement.componentInstance; 26 | expect(app.title).toEqual('gitrepos'); 27 | }); 28 | 29 | it('should render title', () => { 30 | const fixture = TestBed.createComponent(AppComponent); 31 | fixture.detectChanges(); 32 | const compiled = fixture.debugElement.nativeElement; 33 | expect(compiled.querySelector('.content span').textContent).toContain('gitrepos app is running!'); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { NbSidebarService, NbThemeService } from '@nebular/theme'; 3 | import { NgxSpinnerService } from 'ngx-spinner'; 4 | 5 | @Component({ 6 | selector: 'app-root', 7 | templateUrl: './app.component.html', 8 | styleUrls: ['./app.component.scss'], 9 | }) 10 | export class AppComponent implements OnInit { 11 | constructor( 12 | private sidebarService: NbSidebarService, 13 | private themeService: NbThemeService, 14 | private spinner: NgxSpinnerService 15 | ) {} 16 | title = 'gitrepos'; 17 | sun = 'sun'; 18 | moon = 'moon'; 19 | icon = this.sun; 20 | 21 | items = [ 22 | { 23 | title: 'Trending Repos', 24 | icon: 'book', 25 | link: '/', 26 | pathMatch: '/full', 27 | }, 28 | { 29 | title: 'Trending Devs', 30 | icon: 'people', 31 | link: '/developer', 32 | pathMatch: '/full', 33 | }, 34 | { 35 | title: 'About', 36 | icon: 'heart', 37 | link: '/about', 38 | pathMatch: '/full', 39 | }, 40 | { 41 | title: 'Community', 42 | icon: 'paper-plane-outline', 43 | url: 'https://tx.me/gitrepos', 44 | target: '_blank', 45 | }, 46 | ]; 47 | 48 | toggle() { 49 | this.sidebarService.toggle(false, 'right'); 50 | } 51 | collapseAll() { 52 | this.sidebarService.toggle(false, 'right'); 53 | } 54 | 55 | changeTheme() { 56 | if (this.icon === this.sun) { 57 | this.themeService.changeTheme('default'); 58 | this.icon = this.moon; 59 | } else { 60 | this.themeService.changeTheme('cosmic'); 61 | this.icon = this.sun; 62 | } 63 | } 64 | ngOnInit() { 65 | /** spinner starts on init */ 66 | this.spinner.show(); 67 | 68 | setTimeout(() => { 69 | /** spinner ends after 5 seconds */ 70 | this.spinner.hide(); 71 | }, 5000); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; 3 | 4 | import { AppRoutingModule } from './app-routing.module'; 5 | import { AppComponent } from './app.component'; 6 | import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 7 | import { NgProgressModule} from '@ngx-progressbar/core'; 8 | import { NgProgressHttpModule } from '@ngx-progressbar/http'; 9 | import { NbThemeModule, 10 | NbLayoutModule, 11 | NbSearchModule, 12 | NbButtonModule, 13 | NbSidebarModule, 14 | NbIconModule, 15 | NbMenuModule, 16 | NbCardModule, 17 | NbTooltipModule, 18 | NbSelectModule} from '@nebular/theme'; 19 | import { NbEvaIconsModule } from '@nebular/eva-icons'; 20 | import { HomeComponent } from './home/home.component'; 21 | import { HttpClientModule } from '@angular/common/http'; 22 | import { DeveloperComponent } from './developer/developer.component'; 23 | import { AboutComponent } from './about/about.component'; 24 | import { FormsModule } from '@angular/forms'; 25 | import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; 26 | import { ServiceWorkerModule } from '@angular/service-worker'; 27 | import { environment } from '../environments/environment'; 28 | import { NgxSpinnerModule } from "ngx-spinner"; 29 | 30 | @NgModule({ 31 | declarations: [ 32 | AppComponent, 33 | HomeComponent, 34 | DeveloperComponent, 35 | AboutComponent 36 | ], 37 | imports: [ 38 | BrowserModule, 39 | AppRoutingModule, 40 | BrowserAnimationsModule, 41 | HttpClientModule, 42 | FormsModule, 43 | NgProgressModule.withConfig({ 44 | spinner: false, 45 | meteor: true 46 | }), 47 | NgProgressHttpModule, 48 | NbThemeModule.forRoot({ name: 'cosmic' }), 49 | NbLayoutModule, 50 | NbEvaIconsModule, 51 | NbSearchModule, 52 | NbButtonModule, 53 | BrowserModule, 54 | FormsModule, 55 | NbCardModule, 56 | NbTooltipModule, 57 | NbSelectModule, 58 | NbSidebarModule.forRoot(), 59 | NbSidebarModule, 60 | NbMenuModule.forRoot(), 61 | NbEvaIconsModule, 62 | NbIconModule, 63 | FontAwesomeModule, 64 | NgxSpinnerModule, 65 | ServiceWorkerModule.register('/pwabuilder-sw.js', { enabled: environment.production }) 66 | ], 67 | schemas: [CUSTOM_ELEMENTS_SCHEMA], 68 | providers: [], 69 | bootstrap: [AppComponent] 70 | }) 71 | export class AppModule { } 72 | -------------------------------------------------------------------------------- /src/app/developer/developer.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 10 | Daily 11 | Weekly 12 | Monthly 13 | 14 |
15 |
16 | 49 | -------------------------------------------------------------------------------- /src/app/developer/developer.component.scss: -------------------------------------------------------------------------------- 1 | @import "../../themes"; 2 | 3 | .container { 4 | display: block; 5 | width: 100%; 6 | } 7 | 8 | .card { 9 | float: left; 10 | padding-left:35px; 11 | padding-right:-35px; 12 | /*setting width for each and every card element as well as -10px for removing the margin width for 5 elements*/; 13 | width: calc( 100% / 2 - 10px); 14 | } 15 | .des{ 16 | margin-bottom: max-content; 17 | } 18 | 19 | /*first element*/ 20 | 21 | .container .card:first-child { 22 | margin-left: 0; 23 | } 24 | 25 | 26 | /*last element of the first row*/ 27 | 28 | .container .card:nth-child(5n) { 29 | margin-right: 0; 30 | } 31 | 32 | 33 | /*first-element of the 2nd row*/ 34 | 35 | .container .card:nth-child(5n+1) { 36 | margin-left: 0; 37 | } 38 | 39 | 40 | /*last element*/ 41 | 42 | .container .card:last-child { 43 | margin-right: 0; 44 | } 45 | 46 | 47 | .card-row { 48 | display: flex; 49 | margin: 0 -0.5rem; 50 | 51 | } 52 | 53 | 54 | .header { 55 | display: flex; 56 | align-items: center; 57 | justify-content: space-between; 58 | flex-wrap: wrap; 59 | } 60 | 61 | .filter { 62 | margin-bottom: 2rem; 63 | padding-left: 2.2em; 64 | } 65 | 66 | .language { 67 | margin-right: 10px; 68 | } 69 | 70 | .repoName { 71 | font-weight: 400; 72 | text-decoration: none; 73 | display: inline-block; 74 | 75 | } 76 | 77 | .repoName:first-letter { 78 | text-transform: uppercase; 79 | } 80 | 81 | .avatar { 82 | vertical-align: middle; 83 | margin-right: 25px; 84 | width: 100px; 85 | border-radius: 20%; 86 | } 87 | 88 | .icon { 89 | width: 1em; 90 | margin-right: 3px; 91 | vertical-align: middle; 92 | } 93 | 94 | .starCount { 95 | display: inline-block; 96 | } 97 | .repoCard{ 98 | margin-right: 40px; 99 | margin-left: -20px; 100 | 101 | 102 | } 103 | .iconCount{ 104 | padding: 1em; 105 | margin: 0; 106 | } 107 | 108 | .iconSpace{ 109 | padding: 0.2em; 110 | margin: 0; 111 | } 112 | 113 | a{ 114 | text-decoration: none; 115 | } 116 | .zoom{ 117 | transition: transform .2s; 118 | } 119 | .zoom:hover{ 120 | -ms-transform: scale(0.2); /* IE 9 */ 121 | -webkit-transform: scale(0.2); /* Safari 3-8 */ 122 | transform: scale(1.05); 123 | 124 | 125 | } 126 | 127 | 128 | @media only screen and (max-width: 576px) { 129 | .card { 130 | max-width: 570px; 131 | float: left; 132 | margin: auto; 133 | padding-left:35px; 134 | width: calc( 100% / 1 - 10px); 135 | } 136 | .repoCard{ 137 | height: max-content; 138 | margin-left: -35px; 139 | margin-right: -10px; 140 | 141 | } 142 | .filter { 143 | margin-bottom: 2rem; 144 | margin-left: auto; 145 | margin-right: auto; 146 | } 147 | } 148 | 149 | 150 | -------------------------------------------------------------------------------- /src/app/developer/developer.component.spec.ts: -------------------------------------------------------------------------------- 1 | 2 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 3 | 4 | import { DeveloperComponent } from './developer.component'; 5 | 6 | describe('DeveloperComponent', () => { 7 | let component: DeveloperComponent; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(async(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ DeveloperComponent ] 13 | }) 14 | .compileComponents(); 15 | })); 16 | 17 | beforeEach(() => { 18 | fixture = TestBed.createComponent(DeveloperComponent); 19 | component = fixture.componentInstance; 20 | fixture.detectChanges(); 21 | }); 22 | 23 | it('should create', () => { 24 | expect(component).toBeTruthy(); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /src/app/developer/developer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { TrendingService } from '../service/trending.service'; 3 | import { Developer } from '../model/developer'; 4 | import { Language } from '../model/language'; 5 | import { FormControl } from '@angular/forms'; 6 | import { 7 | faCodeBranch, 8 | faFileCode, 9 | faStar, 10 | } from '@fortawesome/free-solid-svg-icons'; 11 | @Component({ 12 | selector: 'app-developer', 13 | templateUrl: './developer.component.html', 14 | styleUrls: ['./developer.component.scss'], 15 | }) 16 | export class DeveloperComponent implements OnInit { 17 | fork = faCodeBranch; 18 | language = faFileCode; 19 | star = faStar; 20 | developers: Developer; 21 | languages: Language; 22 | selectedSince = 'daily'; 23 | selectedLanguage = 'all'; 24 | loading = true; 25 | 26 | constructor(private trendingService: TrendingService) {} 27 | 28 | ngOnInit() { 29 | this.loadLanguages(); 30 | this.loadDevs(); 31 | } 32 | 33 | onLanuguageSelected(event) { 34 | this.loadDevs(event, this.selectedSince); 35 | } 36 | 37 | onSinceSelected(event) { 38 | this.loadDevs(this.selectedLanguage, event); 39 | } 40 | 41 | loadDevs(language: string = '', since: string = '') { 42 | language = language !== 'all' ? language : ''; 43 | this.trendingService.getTrendingDevs(language, since).subscribe({ 44 | next: (data: Developer) => (this.developers = data), 45 | complete: () => this.loading === false, 46 | }); 47 | } 48 | 49 | loadLanguages() { 50 | this.trendingService.getLanguages().subscribe({ 51 | next: (data: Language) => (this.languages = data), 52 | }); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/app/home/home.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 10 | Languages 11 | {{ language.name }} 16 | 17 | 24 | Daily 25 | Weekly 26 | Monthly 27 | 28 |
29 |
30 |
31 |
32 | 33 | 34 | 35 | avatar 37 | 38 | {{ repository.name }} |
40 | {{repository.author}} 41 |
42 | 43 | 44 | {{ repository.description }} 45 | 46 | 47 | {{ 49 | repository.stars }} 51 | {{ 53 | repository.forks}} 55 | {{ 57 | repository.language}} 59 | 60 | 61 | 62 |
63 |
64 | -------------------------------------------------------------------------------- /src/app/home/home.component.scss: -------------------------------------------------------------------------------- 1 | @import "../../themes"; 2 | 3 | .container { 4 | display: block; 5 | width: 100%; 6 | } 7 | 8 | .card { 9 | float: left; 10 | margin: auto; 11 | padding-left:35px; 12 | 13 | /*setting width for each and every card element as well as -10px for removing the margin width for 5 elements*/ 14 | width: calc( 100% / 2 - 10px); 15 | } 16 | .des{ 17 | overflow:hidden;resize:none; 18 | } 19 | 20 | /*first element*/ 21 | 22 | .container .card:first-child { 23 | margin-left: 0; 24 | } 25 | 26 | 27 | /*last element of the first row*/ 28 | 29 | .container .card:nth-child(5n) { 30 | margin-right: 0; 31 | } 32 | 33 | 34 | /*first-element of the 2nd row*/ 35 | 36 | .container .card:nth-child(5n+1) { 37 | margin-left: 0; 38 | } 39 | 40 | 41 | /*last element*/ 42 | 43 | .container .card:last-child { 44 | margin-right: 0; 45 | } 46 | 47 | 48 | .card-row { 49 | display: flex; 50 | margin: 0 -0.5rem; 51 | 52 | } 53 | 54 | 55 | .header { 56 | display: flex; 57 | align-items: center; 58 | justify-content: space-between; 59 | flex-wrap: wrap; 60 | } 61 | 62 | .filter { 63 | margin-bottom: 2rem; 64 | padding-left: 2.2em; 65 | } 66 | 67 | .language { 68 | margin-right: 10px; 69 | } 70 | 71 | .repoName { 72 | font-weight: 400; 73 | text-decoration: none; 74 | display: inline-block; 75 | 76 | } 77 | 78 | .repoName:first-letter { 79 | text-transform: uppercase; 80 | } 81 | 82 | .avatar { 83 | vertical-align: middle; 84 | margin-right: 25px; 85 | width: 75px; 86 | border-radius: 20%; 87 | } 88 | 89 | .icon { 90 | width: 1em; 91 | margin-right: 3px; 92 | vertical-align: middle; 93 | } 94 | 95 | .repoCard{ 96 | margin-right: 40px; 97 | height: 20rem; 98 | margin-left: -20px; 99 | 100 | } 101 | 102 | .iconCount{ 103 | padding: 0.5em; 104 | margin: 0; 105 | display: inline-block; 106 | } 107 | 108 | .iconSpace{ 109 | padding: 0.2em; 110 | margin: 0; 111 | } 112 | 113 | a{ 114 | text-decoration: none; 115 | 116 | } 117 | .zoom{ 118 | transition: transform .2s; 119 | } 120 | .zoom:hover{ 121 | -ms-transform: scale(0.2); /* IE 9 */ 122 | -webkit-transform: scale(0.2); /* Safari 3-8 */ 123 | transform: scale(1.05); 124 | 125 | 126 | } 127 | 128 | 129 | @media only screen and (max-width: 576px) { 130 | .card { 131 | max-width: 570px; 132 | float: left; 133 | margin: auto; 134 | padding-left:35px; 135 | width: calc( 100% / 1 - 10px); 136 | } 137 | .repoCard{ 138 | height: max-content; 139 | margin-left: -35px; 140 | margin-right: -10px; 141 | 142 | 143 | } 144 | .filter { 145 | margin-bottom: 2rem; 146 | margin-left: auto; 147 | margin-right: auto; 148 | } 149 | } 150 | 151 | 152 | -------------------------------------------------------------------------------- /src/app/home/home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { HomeComponent } from './home.component'; 4 | 5 | describe('HomeComponent', () => { 6 | let component: HomeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ HomeComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(HomeComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { TrendingService } from '../service/trending.service'; 3 | import { Repository } from '../model/repository'; 4 | import { Language } from '../model/language'; 5 | import { faCodeBranch,faFileCode,faStar } from '@fortawesome/free-solid-svg-icons'; 6 | @Component({ 7 | selector: 'app-home', 8 | templateUrl: './home.component.html', 9 | styleUrls: ['./home.component.scss'] 10 | }) 11 | 12 | export class HomeComponent implements OnInit { 13 | fork = faCodeBranch; 14 | language=faFileCode; 15 | star=faStar; 16 | repositories: Repository; 17 | languages: Language; 18 | selectedSince = 'daily'; 19 | selectedLanguage = 'all'; 20 | loading = true; 21 | 22 | constructor(private trendingService: TrendingService) { } 23 | 24 | ngOnInit() { 25 | this.loadLanguages(); 26 | this.loadRepos(); 27 | } 28 | 29 | onLanuguageSelected(event) { 30 | this.loadRepos(event, this.selectedSince); 31 | } 32 | 33 | onSinceSelected(event) { 34 | this.loadRepos(this.selectedLanguage, event); 35 | } 36 | 37 | loadRepos(language: string = '', since: string = '') { 38 | language = (language !== 'all' ? language : ''); 39 | this.trendingService.getTrendingRepos(language, since).subscribe({ 40 | next: (data: Repository) => this.repositories = data, 41 | complete: () => this.loading === false 42 | }); 43 | } 44 | 45 | loadLanguages() { 46 | this.trendingService.getLanguages().subscribe({ 47 | next: (data: Language) => this.languages = data 48 | }); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/app/model/developer.ts: -------------------------------------------------------------------------------- 1 | export class Developer { 2 | username: string; 3 | name: string; 4 | type: string; 5 | url: string; 6 | avatar: string; 7 | repo: object; 8 | sponsorUrl: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/app/model/language.ts: -------------------------------------------------------------------------------- 1 | export class Language { 2 | urlParam: string; 3 | name: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/model/repository.ts: -------------------------------------------------------------------------------- 1 | export class Repository { 2 | author: string; 3 | avatar: string; 4 | name: string; 5 | url: string; 6 | description: string; 7 | language: string; 8 | languageColor: string; 9 | stars: number; 10 | forks: number; 11 | currenPeriodStars: number; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/service/trending.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { TrendingService } from './trending.service'; 4 | 5 | describe('TrendingService', () => { 6 | beforeEach(() => TestBed.configureTestingModule({})); 7 | 8 | it('should be created', () => { 9 | const service: TrendingService = TestBed.get(TrendingService); 10 | expect(service).toBeTruthy(); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /src/app/service/trending.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from '@angular/common/http'; 3 | import { Observable } from 'rxjs'; 4 | import { Repository } from '../model/repository'; 5 | import { Developer } from '../model/developer'; 6 | import { Language } from '../model/language'; 7 | 8 | @Injectable({ 9 | providedIn: 'root' 10 | }) 11 | export class TrendingService { 12 | 13 | url = 'https://api.gitterapp.com'; 14 | 15 | constructor(private http: HttpClient) { 16 | } 17 | 18 | getTrendingRepos(language: string, since: string): Observable { 19 | return this.http.get(`${this.url}/repositories?language=${language}&since=${since}`); 20 | } 21 | 22 | getTrendingDevs(language: string, since: string): Observable { 23 | return this.http.get(`${this.url}/developers?language=${language}&since=${since}`); 24 | } 25 | 26 | getLanguages(): Observable { 27 | return this.http.get(`${this.url}/languages`); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/.gitkeep -------------------------------------------------------------------------------- /src/assets/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/icons/icon-128x128.png -------------------------------------------------------------------------------- /src/assets/icons/icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/icons/icon-144x144.png -------------------------------------------------------------------------------- /src/assets/icons/icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/icons/icon-152x152.png -------------------------------------------------------------------------------- /src/assets/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/icons/icon-192x192.png -------------------------------------------------------------------------------- /src/assets/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/icons/icon-384x384.png -------------------------------------------------------------------------------- /src/assets/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/icons/icon-512x512.png -------------------------------------------------------------------------------- /src/assets/icons/icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/icons/icon-72x72.png -------------------------------------------------------------------------------- /src/assets/icons/icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/assets/icons/icon-96x96.png -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: true, 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hyraze/gitrepos/d2fd663599fcd961c6098c69fcd7639ed165f35d/src/favicon.ico -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | GitRepos 6 | 7 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 43 | 44 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /src/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Gitrepos", 3 | "short_name": "gitrepos", 4 | "theme_color": "#1976d2", 5 | "background_color": "#fafafa", 6 | "display": "standalone", 7 | "scope": "./", 8 | "start_url": "https://gitrepos.xyz", 9 | "icons": [ 10 | { 11 | "src": "assets/icons/icon-72x72.png", 12 | "sizes": "72x72", 13 | "type": "image/png", 14 | "purpose": "maskable any" 15 | }, 16 | { 17 | "src": "assets/icons/icon-96x96.png", 18 | "sizes": "96x96", 19 | "type": "image/png", 20 | "purpose": "maskable any" 21 | }, 22 | { 23 | "src": "assets/icons/icon-128x128.png", 24 | "sizes": "128x128", 25 | "type": "image/png", 26 | "purpose": "maskable any" 27 | }, 28 | { 29 | "src": "assets/icons/icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image/png", 32 | "purpose": "maskable any" 33 | }, 34 | { 35 | "src": "assets/icons/icon-152x152.png", 36 | "sizes": "152x152", 37 | "type": "image/png", 38 | "purpose": "maskable any" 39 | }, 40 | { 41 | "src": "assets/icons/icon-192x192.png", 42 | "sizes": "192x192", 43 | "type": "image/png", 44 | "purpose": "maskable any" 45 | }, 46 | { 47 | "src": "assets/icons/icon-384x384.png", 48 | "sizes": "384x384", 49 | "type": "image/png", 50 | "purpose": "maskable any" 51 | }, 52 | { 53 | "src": "assets/icons/icon-512x512.png", 54 | "sizes": "512x512", 55 | "type": "image/png", 56 | "purpose": "maskable any" 57 | } 58 | ], 59 | "url" : "https://gitrepos.xyz", 60 | "lang" : "", 61 | "screenshots" : [], 62 | "description" : "Get the latest trending Repos and Devs from Github", 63 | "generated" : "" 64 | } 65 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** 22 | * By default, zone.js will patch all possible macroTask and DomEvents 23 | * user can disable parts of macroTask/DomEvents patch by setting following flags 24 | * because those flags need to be set before `zone.js` being loaded, and webpack 25 | * will put import in the top of bundle, so user need to create a separate file 26 | * in this directory (for example: zone-flags.ts), and put the following flags 27 | * into that file, and then add the following code before importing zone.js. 28 | * import './zone-flags.ts'; 29 | * 30 | * The flags allowed in zone-flags.ts are listed here. 31 | * 32 | * The following flags will work for all browsers. 33 | * 34 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 35 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 36 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 37 | * 38 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 39 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 40 | * 41 | * (window as any).__Zone_enable_cross_context_check = true; 42 | * 43 | */ 44 | 45 | /*************************************************************************************************** 46 | * Zone JS is required by default for Angular itself. 47 | */ 48 | import 'zone.js/dist/zone'; // Included with Angular CLI. 49 | 50 | 51 | /*************************************************************************************************** 52 | * APPLICATION IMPORTS 53 | */ 54 | -------------------------------------------------------------------------------- /src/pwabuilder-sw.js: -------------------------------------------------------------------------------- 1 | // This is the "Offline page" service worker 2 | 3 | importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.0.0/workbox-sw.js'); 4 | 5 | const CACHE = "pwabuilder-page"; 6 | 7 | // TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html"; 8 | const offlineFallbackPage = "ToDo-replace-this-name.html"; 9 | 10 | self.addEventListener("message", (event) => { 11 | if (event.data && event.data.type === "SKIP_WAITING") { 12 | self.skipWaiting(); 13 | } 14 | }); 15 | 16 | self.addEventListener('install', async (event) => { 17 | event.waitUntil( 18 | caches.open(CACHE) 19 | .then((cache) => cache.add(offlineFallbackPage)) 20 | ); 21 | }); 22 | 23 | if (workbox.navigationPreload.isSupported()) { 24 | workbox.navigationPreload.enable(); 25 | } 26 | 27 | self.addEventListener('fetch', (event) => { 28 | if (event.request.mode === 'navigate') { 29 | event.respondWith((async () => { 30 | try { 31 | const preloadResp = await event.preloadResponse; 32 | 33 | if (preloadResp) { 34 | return preloadResp; 35 | } 36 | 37 | const networkResp = await fetch(event.request); 38 | return networkResp; 39 | } catch (error) { 40 | 41 | const cache = await caches.open(CACHE); 42 | const cachedResp = await cache.match(offlineFallbackPage); 43 | return cachedResp; 44 | } 45 | })()); 46 | } 47 | }); 48 | -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | @import 'themes'; 2 | 3 | @import '@nebular/theme/styles/globals'; 4 | 5 | @include nb-install() { 6 | @include nb-theme-global(); 7 | }; 8 | @include nb-install-component { 9 | 10 | background: nb-theme(background-basic-color-1); 11 | } 12 | /* You can add global styles to this file, and also import other style files */ -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | // First, initialize the Angular testing environment. 10 | getTestBed().initTestEnvironment( 11 | BrowserDynamicTestingModule, 12 | platformBrowserDynamicTesting(), { 13 | teardown: { destroyAfterEach: false } 14 | } 15 | ); 16 | -------------------------------------------------------------------------------- /src/themes.scss: -------------------------------------------------------------------------------- 1 | @import '@nebular/theme/styles/theming'; 2 | @import '@nebular/theme/styles/themes/dark'; 3 | @import '@nebular/theme/styles/themes/default'; 4 | @import '@nebular/theme/styles/themes/cosmic'; 5 | @import url('https://fonts.googleapis.com/css2?family=Space+Mono:wght@700&display=swap'); 6 | 7 | $nb-enable-css-custom-properties: true; 8 | 9 | $nb-themes: nb-register-theme(( 10 | color-primary-100: #faf7ff, // <- new primary color 11 | color-primary-200: #ece3ff, 12 | color-primary-300: #d5bfff, 13 | color-primary-400: #b18aff, 14 | color-primary-500: #a16eff, 15 | color-primary-600: #7b51db, 16 | color-primary-700: #5a37b8, 17 | color-primary-800: #3e2494, 18 | color-primary-900: #29157a, 19 | font-family-primary: unquote('Space Mono,monospace'), 20 | font-family-secondary: font-family-primary, 21 | text-basic-color: color-primary-600, 22 | text-disabled-color: color-primary-600, 23 | ), default, default); 24 | 25 | $nb-themes: nb-register-theme(( 26 | color-primary-100: #faf7ff, // <- new primary color 27 | color-primary-200: #ece3ff, 28 | color-primary-300: #d5bfff, 29 | color-primary-400: #b18aff, 30 | color-primary-500: #a16eff, 31 | color-primary-600: #7b51db, 32 | color-primary-700: #5a37b8, 33 | color-primary-800: #3e2494, 34 | color-primary-900: #29157a, 35 | color-primary-1000:#252481, 36 | link-text-color: color-primary-300, 37 | text-basic-color: color-primary-300, 38 | text-disabled-color: color-primary-300, 39 | background-basic-color: color-primary-1000, 40 | font-family-primary: unquote('Space Mono,monospace'), 41 | font-family-secondary: font-family-primary, 42 | ), dark, dark); 43 | 44 | $nb-themes: nb-register-theme(( 45 | color-primary-100: #faf7ff, // <- new primary color 46 | color-primary-200: #ece3ff, 47 | color-primary-300: #d5bfff, 48 | color-primary-400: #b18aff, 49 | color-primary-500: #a16eff, 50 | color-primary-600: #7b51db, 51 | color-primary-700: #5a37b8, 52 | color-primary-800: #3e2494, 53 | color-primary-900: #29157a, 54 | color-primary-1000:#151530, 55 | link-text-color: color-primary-300, 56 | text-basic-color: color-primary-300, 57 | text-disabled-color: color-primary-300, 58 | background-basic-color-1: color-primary-1000, 59 | font-family-primary: unquote('Space Mono,monospace'), 60 | font-family-secondary: font-family-primary, 61 | ), cosmic, cosmic); 62 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": [ 8 | "src/main.ts", 9 | "src/polyfills.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.ts" 13 | ], 14 | "exclude": [ 15 | "src/test.ts", 16 | "src/**/*.spec.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "downlevelIteration": true, 9 | "experimentalDecorators": true, 10 | "module": "esnext", 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "target": "ES2022", 14 | "typeRoots": [ 15 | "node_modules/@types" 16 | ], 17 | "lib": [ 18 | "es2018", 19 | "dom" 20 | ], 21 | "useDefineForClassFields": false 22 | }, 23 | "angularCompilerOptions": { 24 | "fullTemplateTypeCheck": true, 25 | "strictInjectionParameters": true 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/spec", 5 | "types": [ 6 | "jasmine", 7 | "node" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:recommended", 3 | "rules": { 4 | "array-type": false, 5 | "arrow-parens": false, 6 | "deprecation": { 7 | "severity": "warning" 8 | }, 9 | "component-class-suffix": true, 10 | "contextual-lifecycle": true, 11 | "directive-class-suffix": true, 12 | "directive-selector": [ 13 | true, 14 | "attribute", 15 | "app", 16 | "camelCase" 17 | ], 18 | "component-selector": [ 19 | true, 20 | "element", 21 | "app", 22 | "kebab-case" 23 | ], 24 | "import-blacklist": [ 25 | true, 26 | "rxjs/Rx" 27 | ], 28 | "interface-name": false, 29 | "max-classes-per-file": false, 30 | "max-line-length": [ 31 | true, 32 | 140 33 | ], 34 | "member-access": false, 35 | "member-ordering": [ 36 | true, 37 | { 38 | "order": [ 39 | "static-field", 40 | "instance-field", 41 | "static-method", 42 | "instance-method" 43 | ] 44 | } 45 | ], 46 | "no-consecutive-blank-lines": false, 47 | "no-console": [ 48 | true, 49 | "debug", 50 | "info", 51 | "time", 52 | "timeEnd", 53 | "trace" 54 | ], 55 | "no-empty": false, 56 | "no-inferrable-types": [ 57 | true, 58 | "ignore-params" 59 | ], 60 | "no-non-null-assertion": true, 61 | "no-redundant-jsdoc": true, 62 | "no-switch-case-fall-through": true, 63 | "no-use-before-declare": true, 64 | "no-var-requires": false, 65 | "object-literal-key-quotes": [ 66 | true, 67 | "as-needed" 68 | ], 69 | "object-literal-sort-keys": false, 70 | "ordered-imports": false, 71 | "quotemark": [ 72 | true, 73 | "single" 74 | ], 75 | "trailing-comma": false, 76 | "no-conflicting-lifecycle": true, 77 | "no-host-metadata-property": true, 78 | "no-input-rename": true, 79 | "no-inputs-metadata-property": true, 80 | "no-output-native": true, 81 | "no-output-on-prefix": true, 82 | "no-output-rename": true, 83 | "no-outputs-metadata-property": true, 84 | "template-banana-in-box": true, 85 | "template-no-negated-async": true, 86 | "use-lifecycle-interface": true, 87 | "use-pipe-transform-interface": true 88 | }, 89 | "rulesDirectory": [ 90 | "codelyzer" 91 | ] 92 | } --------------------------------------------------------------------------------