1
0
Fork 0
mirror of https://github.com/dilllxd/gitfolio.git synced 2024-08-14 22:28:09 +00:00

Add files via upload

This commit is contained in:
imfunny 2019-08-12 09:40:00 +05:30 committed by GitHub
parent 4a2872171d
commit ee354ae852
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 3180 additions and 2387 deletions

View file

@ -1,6 +1,6 @@
<img src="https://i.imgur.com/eA6clZr.png"> <img src="https://i.imgur.com/eA6clZr.png">
# Gitfolio [![Tweet](https://img.shields.io/twitter/url/https/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=personal%20website%20and%20a%20blog%20for%20every%20github%20user%20&url=https://github.com/imfunniee/gitfolio) ![GitHub release](https://img.shields.io/github/release/imfunniee/gitfolio.svg?style=popout-square) ![npm](https://img.shields.io/npm/dm/gitfolio.svg?style=popout-square) ![GitHub top language](https://img.shields.io/github/languages/top/imfunniee/gitfolio.svg?style=popout-square) ![GitHub last commit](https://img.shields.io/github/last-commit/imfunniee/gitfolio.svg?style=popout-square) ![GitHub](https://img.shields.io/github/license/imfunniee/gitfolio.svg?style=popout-square) # Gitfolio [![Tweet](https://img.shields.io/twitter/url/https/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=personal%20website%20and%20a%20blog%20for%20every%20github%20user%20@imfunnieee%20&url=https://github.com/imfunniee/gitfolio) ![GitHub release](https://img.shields.io/github/release/imfunniee/gitfolio.svg?style=popout-square) ![npm](https://img.shields.io/npm/dm/gitfolio.svg?style=popout-square) ![GitHub top language](https://img.shields.io/github/languages/top/imfunniee/gitfolio.svg?style=popout-square) ![GitHub last commit](https://img.shields.io/github/last-commit/imfunniee/gitfolio.svg?style=popout-square) ![GitHub](https://img.shields.io/github/license/imfunniee/gitfolio.svg?style=popout-square)
### personal website + blog for every github user ### personal website + blog for every github user
@ -8,7 +8,6 @@ Gitfolio will help you get started with a portfolio website where you could show
Check out this [live demo](https://imfunniee.github.io/gitfolio/) to see gitfolio in action. Check out this [live demo](https://imfunniee.github.io/gitfolio/) to see gitfolio in action.
# Getting Started # Getting Started
### Let's Install ### Let's Install
@ -21,22 +20,30 @@ npm i gitfolio -g
### Let's Build ### Let's Build
Using the UI
```sh
$ gitfolio ui
```
> Tip: You can use ui to create new blogs and for updating your folio too.
or
```sh ```sh
gitfolio build <username> gitfolio build <username>
``` ```
`<username>` is your username on github. This will build your website using your GitHub username and put it in the `/dist` folder. `<username>` is your username on github. This will build your website using your GitHub username and put it in the `/dist` folder.
To run your website use `run` command To run your website use `run` command, Default port is 3000
```sh ```sh
gitfolio run gitfolio run -p [port]
``` ```
Open your browser at http://localhost:3000
🎉 Congrats, you just made yourself a personal website! 🎉 Congrats, you just made yourself a personal website!
### Let's Customize ### Let's Customize
#### Forks #### Forks
@ -67,11 +74,12 @@ $ gitfolio build <username> --sort star --order desc
Themes are specified using the `--theme [theme-name]` flag when running the `build` command. The available themes are Themes are specified using the `--theme [theme-name]` flag when running the `build` command. The available themes are
* `light` - `light`
* `dark` - `dark`
> TODO: Add more themes > TODO: Add more themes
For example, the following command will build the website with the dark theme For example, the following command will build the website with the dark theme
```sh ```sh
$ gitfolio build <username> --theme dark $ gitfolio build <username> --theme dark
``` ```
@ -86,19 +94,20 @@ $ gitfolio build <username> --background https://images.unsplash.com/photo-15572
You could also add in your custom CSS inside `index.css` to give it a more personal feel. You could also add in your custom CSS inside `index.css` to give it a more personal feel.
### Add Twitter, LinkedIn and Medium Links on your profile ### Add Twitter, LinkedIn and Medium links on your profile
Twitter, LinkedIn and Medium Links to your profile while building Twitter, LinkedIn and Medium Links to your profile while building
```sh ```sh
gitfolio build <username> --twitter <twitter_username> --linkedin <linkedin_username> --medium <medium_username> gitfolio build <username> --twitter <twitter_username> --linkedin <linkedin_username> --medium <medium_username>
``` ```
### Let's Publish ### Let's Publish
Head over to GitHub and create a new repository named `username.github.io`, where username is your username. Push the files inside`/dist` folder to repo you just created. Head over to GitHub and create a new repository named `username.github.io`, where username is your username. Push the files inside`/dist` folder to repo you just created.
Go To `username.github.io` your site should be up!! Go To `username.github.io` your site should be up!!
### Updating ### Updating
To update your info, simply run To update your info, simply run
@ -106,27 +115,33 @@ To update your info, simply run
```sh ```sh
$ gitfolio update $ gitfolio update
``` ```
or use the `Update` options in gitfolio's UI
This will update your info and your repository info. This will update your info and your repository info.
To Update background or theme you need to run `build` command again. To Update background or theme you need to run `build` command again.
### Add a Blog ### Add a Blog
To add your first blog run this command. To add your first blog use the UI.
```sh ```sh
$ gitfolio blog my-first-blog $ gitfolio ui
``` ```
> (use "-" instead of spaces)
This will create a `my-first-blog` folder inside `blog`. Inside `my-first-blog` you will find an `index.html` file which contains all the necessary elements for writing a blog. Customize the content of the file to write your first blog. This will open up a UI page and you can click on `New Blog` to create a new blog. Once you are done writing your blog you can hit the `Create Blog`.
This will create a blog inside `./dist/blog` folder.
Look for success or error in your terminal.
This also adds content to `blog.json` file. This file helps in showcasing your blogs on your personal website as [cards](https://imfunniee.github.io/gitfolio/#blog_section). You could customize the JSON object that corresponds your current blog. This also adds content to `blog.json` file. This file helps in showcasing your blogs on your personal website as [cards](https://imfunniee.github.io/gitfolio/#blog_section). You could customize the JSON object that corresponds your current blog.
Blog Demo? [here](https://imfunniee.github.io/gitfolio/blog/my-first-post/) Blog Demo? [here](https://imfunniee.github.io/gitfolio/blog/my-first-post/)
Default JSON Format Blog's default JSON Format
``` ```
{ {
"url_title": "my-first-blog", // the title you provide while creating a new blog, this appears in url "url_title": "my-first-blog", // the title you provide while creating a new blog, this appears in url
@ -137,16 +152,10 @@ Default JSON Format
} }
``` ```
More Arguments for Blog ### Follow me on twitter for more updates
```
--subtitle [subtitle] : gives blog a subtitle (Default : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.')
--pagetitle [pagetitle] : gives blog page a title
--folder [folder] : give folder a title
```
> (use "-" instead of spaces)
🙌 [@imfunnieee](https://twitter.com/imfunnieee)
## License ## License
![GitHub](https://img.shields.io/github/license/imfunniee/gitfolio.svg?style=popout-square) ![GitHub](https://img.shields.io/github/license/imfunniee/gitfolio.svg?style=popout-square)

View file

@ -1,9 +1 @@
[ []
{
"url_title": "FooBar",
"title": "FooBar",
"sub_title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"top_image": "https://images.unsplash.com/photo-1553748024-d1b27fb3f960?w=1450",
"visible": true
}
]

View file

@ -1,44 +1,91 @@
<!DOCTYPE html><html lang="en"><head> <!DOCTYPE html>
<meta charset="UTF-8"> <html lang="en">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <head>
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Lorem ipsum dolor</title> <title>Lorem ipsum dolor</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css"> <link
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> rel="stylesheet"
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css"
/>
<link
rel="stylesheet"
href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"
integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"
crossorigin="anonymous"
/>
<script
src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"
></script>
</head> </head>
<body> <body>
<div id="loading"> <div id="loading">
<div id="spinner"></div> <div id="spinner"></div>
</div> </div>
<a href="/" class="go_back"><i class="fas fa-arrow-left"></i></a> <a href="/" class="go_back"><i class="fas fa-arrow-left"></i></a>
<div id="background_overlay"></div>
<div id="background"></div> <div id="background"></div>
<table id="profile_blog"> <table id="profile_blog">
<tbody><tr> <tbody>
<tr>
<td style="width:8vw;"><div id="profile_img_blog"></div></td> <td style="width:8vw;"><div id="profile_img_blog"></div></td>
<td style="width:52vw;"> <td style="width:52vw;">
<div id="username_blog"></div> <div id="username_blog"></div>
</td> </td>
</tr> </tr>
</tbody></table> </tbody>
</table>
<div id="blog-display"> <div id="blog-display">
<h1 id="blog_title">Lorem ipsum dolor</h1> <h1 id="blog_title">Lorem ipsum dolor</h1>
<h2 id="blog_sub_title">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2> <h2 id="blog_sub_title">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</h2>
<div id="blog"> <div id="blog">
<img src="https://images.unsplash.com/photo-1553748024-d1b27fb3f960?w=1450"> <img
src="https://images.unsplash.com/photo-1553748024-d1b27fb3f960?w=1450"
/>
<p> <p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut placerat pretium sem, ac maximus dui sodales a. Nunc aliquet hendrerit turpis ac egestas. Phasellus volutpat tristique maximus. <b>Pellentesque feugiat eget nisi et dignissim.</b> Nam nibh erat, sollicitudin non facilisis nec, scelerisque nec ipsum. Sed accumsan velit condimentum, pharetra felis vitae, commodo tellus. <u><i>Mauris consequat luctus orci.</i></u></p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut placerat
<p> pretium sem, ac maximus dui sodales a. Nunc aliquet hendrerit turpis
Vivamus pharetra lobortis dui non tincidunt. Mauris vitae nisi vestibulum, mollis magna a, maximus mi. Suspendisse dictum eget augue quis sodales. Quisque rutrum ligula nec dapibus tincidunt. <span>Proin hendrerit massa a tellus vestibulum, a hendrerit ipsum iaculis. Suspendisse potenti.</span> Praesent eget erat blandit, finibus sapien vitae, ullamcorper erat. Integer blandit, felis at ullamcorper maximus, odio lectus pretium mauris, vel consequat lectus quam eu risus. Pellentesque gravida nec diam eget vehicula. ac egestas. Phasellus volutpat tristique maximus.
<b>Pellentesque feugiat eget nisi et dignissim.</b> Nam nibh erat,
sollicitudin non facilisis nec, scelerisque nec ipsum. Sed accumsan
velit condimentum, pharetra felis vitae, commodo tellus.
<u><i>Mauris consequat luctus orci.</i></u>
</p> </p>
<img src="https://images.unsplash.com/photo-1556814278-8906c7d3a05f?w=1050">
<p> <p>
Donec hendrerit turpis non libero eleifend dignissim. Mauris non tempor metus, et tristique massa. Integer consequat justo quam, vitae aliquam arcu vestibulum at. Donec porttitor quam in tempus convallis. Praesent feugiat eget eros vitae accumsan. Duis ultricies odio quis nisl volutpat, consectetur imperdiet sem laoreet. Quisque maximus semper ligula at tincidunt. Pellentesque accumsan varius vehicula. Vivamus pharetra lobortis dui non tincidunt. Mauris vitae nisi
vestibulum, mollis magna a, maximus mi. Suspendisse dictum eget augue
quis sodales. Quisque rutrum ligula nec dapibus tincidunt.
<span
>Proin hendrerit massa a tellus vestibulum, a hendrerit ipsum
iaculis. Suspendisse potenti.</span
>
Praesent eget erat blandit, finibus sapien vitae, ullamcorper erat.
Integer blandit, felis at ullamcorper maximus, odio lectus pretium
mauris, vel consequat lectus quam eu risus. Pellentesque gravida nec
diam eget vehicula.
</p>
<img
src="https://images.unsplash.com/photo-1556814278-8906c7d3a05f?w=1050"
/>
<p>
Donec hendrerit turpis non libero eleifend dignissim. Mauris non
tempor metus, et tristique massa. Integer consequat justo quam, vitae
aliquam arcu vestibulum at. Donec porttitor quam in tempus convallis.
Praesent feugiat eget eros vitae accumsan. Duis ultricies odio quis
nisl volutpat, consectetur imperdiet sem laoreet. Quisque maximus
semper ligula at tincidunt. Pellentesque accumsan varius vehicula.
</p> </p>
</div> </div>
</div> </div>
<div id="footer_blog"> <div id="footer_blog">
<a href="https://github.com/imfunniee" target="_blank">made on earth by a human</a> <a href="https://github.com/imfunniee" target="_blank"
>made on earth by a human</a
>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
setTimeout(function() { setTimeout(function() {
@ -56,9 +103,23 @@
icon.setAttribute("href", user[0].userimg); icon.setAttribute("href", user[0].userimg);
icon.setAttribute("type", "image/png"); icon.setAttribute("type", "image/png");
document.getElementsByTagName("head")[0].appendChild(icon); document.getElementsByTagName("head")[0].appendChild(icon);
document.getElementById("profile_img_blog").style.background = `url('${user[0].userimg}') center center`; document.getElementById("profile_img_blog").style.background = `url('${
document.getElementById("username_blog").innerHTML = `<spanstyle="display:${user[0].name == null || !user[0].name ? 'none' : 'block'};">${user[0].name}</span><br>@${user[0].username}<b id="blog_time"></b>`; user[0].userimg
}') center center`;
document.getElementById(
"username_blog"
).innerHTML = `<span style="display:${
user[0].name == null || !user[0].name ? "none" : "block"
};">${user[0].name}</span>@${user[0].username}<b id="blog_time"></b>`;
if ((user[0].theme = "dark.css")) {
document.querySelector("#background_overlay").style.background =
"linear-gradient(0deg, rgba(10, 10, 10, 1), rgba(10, 10, 10, 0.1))";
} else {
document.querySelector("#background_overlay").style.background =
"linear-gradient(0deg, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0.1))";
}
}); });
</script> </script>
</body>
</body></html> </html>

View file

@ -40,8 +40,13 @@ body{
} }
@keyframes rotate { @keyframes rotate {
0% {transform: rotate(0deg);} 0% {
100% {transform: rotate(360deg);} transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
} }
#profile { #profile {
@ -116,20 +121,29 @@ body{
#profile_blog { #profile_blog {
width: 60vw; width: 60vw;
margin: 0px 20vw; margin: 0px 20vw;
margin-top:10vh; margin-top: 34vh;
text-align: left; text-align: left;
z-index: 1; z-index: 1;
} }
#background_overlay {
width: 100vw;
height: 55vh;
position: absolute;
z-index: -1;
top: 0;
left: 0;
}
#background { #background {
width: 100vw; width: 100vw;
height: 55vh; height: 55vh;
background:var(--background-background);
background-size: cover !important; background-size: cover !important;
background-repeat:no-repeat; background-repeat: no-repeat !important;
position: absolute; position: absolute;
z-index:-1; z-index: -2;
margin-top:-10vh; top: 0;
left: 0;
} }
#blog-display h1 { #blog-display h1 {
@ -277,12 +291,14 @@ body{
} }
.projects { .projects {
margin-left: -15px; /* align section w/ heading above */ margin-left: -15px;
/* align section w/ heading above */
} }
.projects a { .projects a {
/* 30px is the gutter size in magic grid */ /* 30px is the gutter size in magic grid */
width: calc(49% - 30px); /* 49% avoids a weird single column on some wide screens */ width: calc(49% - 30px);
/* 49% avoids a weird single column on some wide screens */
display: flex; display: flex;
text-decoration: none; text-decoration: none;
} }
@ -290,6 +306,7 @@ body{
.projects section { .projects section {
width: 100%; width: 100%;
padding: 2.5vh 5%; padding: 2.5vh 5%;
margin: 1vh 0px;
display: inline-block; display: inline-block;
border-radius: 5px; border-radius: 5px;
color: var(--text-color); color: var(--text-color);
@ -340,6 +357,17 @@ body{
.socials { .socials {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
margin: 3vh 0px !important;
}
.socials span {
display: inline-block !important;
margin-right: 2vw !important;
font-weight: normal !important;
}
.socials span a {
font-weight: normal !important;
} }
#blog_section { #blog_section {
@ -348,10 +376,20 @@ body{
} }
#blogs { #blogs {
columns: 2;
}
#blog_title {
font-size: 50px;
}
#blog_sub_title {
font-size: 36px;
margin-top: -2vh;
} }
#blogs section { #blogs section {
width:85%; width: 100%;
display: inline-block; display: inline-block;
border-radius: 5px; border-radius: 5px;
color: var(--text-color); color: var(--text-color);
@ -400,6 +438,7 @@ body{
text-align: center; text-align: center;
position: relative; position: relative;
} }
#display { #display {
width: 90vw; width: 90vw;
padding: 4vh 5vw; padding: 4vh 5vw;
@ -407,6 +446,7 @@ body{
display: inline-block; display: inline-block;
padding-left: 5vw; padding-left: 5vw;
} }
#profile_img { #profile_img {
width: 120px; width: 120px;
height: 120px; height: 120px;
@ -416,26 +456,36 @@ body{
max-height: 120px; max-height: 120px;
margin: 0px auto !important; margin: 0px auto !important;
} }
#work { #work {
margin: 0px; margin: 0px;
} }
.projects { .projects {
margin-left: 0; /* remove neg margin to align w/ header */ margin-left: 0;
/* remove neg margin to align w/ header */
} }
.projects a { .projects a {
width: 100%; width: 100%;
} }
.projects section { .projects section {
width: 88%; width: 88%;
} }
#blogs { #blogs {
columns: 1;
} }
#blogs section { #blogs section {
width: 98%; width: 98%;
} }
#blog_section { #blog_section {
margin: 0px; margin: 0px;
} }
#blog-display { #blog-display {
width: 90vw; width: 90vw;
margin: 0px 5vw; margin: 0px 5vw;
@ -443,13 +493,29 @@ body{
margin-top: 0vh; margin-top: 0vh;
z-index: 1; z-index: 1;
} }
#blog_title {
font-size: 32px !important;
}
#blog_sub_title {
font-size: 24px;
margin-top: -1vh;
}
#profile_blog { #profile_blog {
width: 90vw; width: 90vw;
margin: 0px 5vw; margin: 0px 5vw;
margin-top:10vh; margin-top: 36vh;
text-align: left; text-align: left;
z-index: 1; z-index: 1;
} }
#profile_img_blog {
width: 65px;
height: 65px;
}
.go_back { .go_back {
position: relative; position: relative;
color: var(--text-color); color: var(--text-color);
@ -457,14 +523,25 @@ body{
margin-left: 5vw; margin-left: 5vw;
top: 5vh; top: 5vh;
} }
#blog img { #blog img {
margin: 1vh 0px !important; margin: 1vh 0px !important;
} }
#blog p { #blog p {
margin: 2vh 0px; margin: 2vh 0px;
} }
} }
::-webkit-scrollbar {width:5px;height:5px;} ::-webkit-scrollbar {
::-webkit-scrollbar-track {background:var(--bg-color);} width: 5px;
::-webkit-scrollbar-thumb {background:var(--text-color);} height: 5px;
}
::-webkit-scrollbar-track {
background: var(--bg-color);
}
::-webkit-scrollbar-thumb {
background: var(--text-color);
}

View file

@ -1,18 +1,27 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title></title> <title></title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css"> <link
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" rel="stylesheet"
integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css"
<script src="https://code.jquery.com/jquery-3.4.1.min.js" />
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> <link
rel="stylesheet"
href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"
integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"
crossorigin="anonymous"
/>
<script
src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"
></script>
<script src="https://unpkg.com/magic-grid/dist/magic-grid.min.js"></script> <script src="https://unpkg.com/magic-grid/dist/magic-grid.min.js"></script>
<link rel="stylesheet" href="index.css"> <link rel="stylesheet" href="index.css" />
</head> </head>
<body> <body>
@ -41,7 +50,9 @@
<div id="blogs"></div> <div id="blogs"></div>
</div> </div>
<div id="footer"> <div id="footer">
<a href="https://github.com/imfunniee" target="_blank">made on earth by a human</a> <a href="https://github.com/imfunniee" target="_blank"
>made on earth by a human</a
>
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
@ -57,13 +68,14 @@
$.getJSON("blog.json", function(blog) { $.getJSON("blog.json", function(blog) {
blog = blog || []; blog = blog || [];
if (blog.length == 0) { if (blog.length == 0) {
return document.getElementById("blog_section").style.display = "none"; return (document.getElementById("blog_section").style.display =
"none");
} }
for (var i = 0; i < blog.length; i++) { for (var i = 0; i < blog.length; i++) {
$("#blogs").append(` $("#blogs").append(`
<a href="./blog/${blog[i].url_title}/" target="_blank"> <a href="./blog/${blog[i].url_title}/" target="_blank">
<section> <section>
<img src="${blog[i].top_image}"> <img src="./blog/${blog[i].url_title}/${blog[i].top_image}">
<div class="blog_container"> <div class="blog_container">
<div class="section_title">${blog[i].title}</div> <div class="section_title">${blog[i].title}</div>
<div class="about_section"> <div class="about_section">
@ -75,21 +87,13 @@
`); `);
} }
}).fail(function() { }).fail(function() {
return document.getElementById("blog_section").style.display = "none"; return (document.getElementById("blog_section").style.display = "none");
}); });
</script> </script>
<script type="text/javascript">
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('service-worker.js');
});
}
</script>
<script> <script>
const magicProjectsGrid = new MagicGrid({ const magicProjectsGrid = new MagicGrid({
container: '#work_section', container: "#work_section",
animate: false, animate: false,
gutter: 30, // default gutter size gutter: 30, // default gutter size
static: true, static: true,
@ -99,20 +103,19 @@
}); });
const magicForksGrid = new MagicGrid({ const magicForksGrid = new MagicGrid({
container: '#forks_section', container: "#forks_section",
animate: false, animate: false,
gutter: 30, // default gutter size gutter: 30, // default gutter size
static: true, static: true,
useMin: false, useMin: false,
maxColumns: 2, maxColumns: 2,
useTransform: true useTransform: true
}) });
$('document').ready(() => { $("document").ready(() => {
magicProjectsGrid.listen(); magicProjectsGrid.listen();
magicForksGrid.listen(); magicForksGrid.listen();
}); });
</script> </script>
</body> </body>
</html> </html>

View file

@ -2,27 +2,33 @@
--bg-color: rgb(10, 10, 10); --bg-color: rgb(10, 10, 10);
--text-color: #fff; --text-color: #fff;
--blog-gray-color: rgb(180, 180, 180); --blog-gray-color: rgb(180, 180, 180);
--background-image: linear-gradient(90deg, rgba(10, 10, 10, 0.6), rgb(10, 10, 10, 1)), url("{{{background}}}"); --background-image: linear-gradient(90deg, rgba(10, 10, 10, 0.3), rgb(10, 10, 10, 1)),
url("{{{background}}}");
--background-background: linear-gradient(0deg, rgba(10, 10, 10, 1), rgba(10, 10, 10, 0.6)), --background-background: linear-gradient(0deg, rgba(10, 10, 10, 1), rgba(10, 10, 10, 0.6)),
url("{{{background}}}") center center fixed; url("{{{background}}}") center center fixed;
--height: 50vh; --height: 50vh;
} }
#display h1 { #display h1 {
-webkit-background-clip: text; -webkit-background-clip: text;
background-clip: text; background-clip: text;
-webkit-text-fill-color: #fff; -webkit-text-fill-color: #fff;
} }
#blog-display h1 { #blog-display h1 {
-webkit-background-clip: text; -webkit-background-clip: text;
background-clip: text; background-clip: text;
-webkit-text-fill-color: #fff; -webkit-text-fill-color: #fff;
} }
.projects section { .projects section {
background: rgb(20, 20, 20); background: rgb(20, 20, 20);
} }
#blog_section section { #blog_section section {
background: rgb(20, 20, 20); background: rgb(20, 20, 20);
} }
@media (max-width: 800px) { @media (max-width: 800px) {
:root { :root {
--background-image: linear-gradient(0deg, rgba(10, 10, 10, 1), rgba(10, 10, 10, 0)), --background-image: linear-gradient(0deg, rgba(10, 10, 10, 1), rgba(10, 10, 10, 0)),

View file

@ -1,54 +1,55 @@
#! /usr/bin/env node #! /usr/bin/env node
/* Argument parser */ /* Argument parser */
const program = require('commander'); const program = require("commander");
process.env.OUT_DIR = process.env.OUT_DIR || process.cwd(); process.env.OUT_DIR = process.env.OUT_DIR || process.cwd();
const {buildCommand} = require('../build'); const { buildCommand } = require("../build");
const {updateCommand} = require('../update'); const { updateCommand } = require("../update");
const {blogCommand} = require('../blog'); const { uiCommand } = require("../ui");
const {runCommand} = require('../run'); const { runCommand } = require("../run");
const {version} = require('../package.json'); const { version } = require("../package.json");
program program
.command('build <username>') .command("build <username>")
.description('Build site with your GitHub username. This will be used to customize your site') .description(
.option('-t, --theme [theme]', 'specify a theme to use', 'light') "Build site with your GitHub username. This will be used to customize your site"
.option('-b, --background [background]', 'set the background image') )
.option('-f, --fork', 'includes forks with repos') .option("-t, --theme [theme]", "specify a theme to use", "light")
.option('-s, --sort [sort]', 'set default sort for repository', 'created') .option("-b, --background [background]", "set the background image")
.option('-o, --order [order]', 'set default order on sort', 'asc') .option("-f, --fork", "includes forks with repos")
.option('-w, --twitter [handle]', 'set Twitter handle') .option("-s, --sort [sort]", "set default sort for repository", "created")
.option('-l, --linkedin [username]', 'specify LinkedIn username') .option("-o, --order [order]", "set default order on sort", "asc")
.option('-m, --medium [username]', 'specify Medium username') .option("-w, --twitter [username]", "specify twitter username")
.action(buildCommand) .option("-l, --linkedin [username]", "specify linkedin username")
.option("-m, --medium [username]", "specify medium username")
.option("-d, --dribbble [username]", "specify dribbble username")
.action(buildCommand);
program program
.command('update') .command("update")
.description('Update user and repository data') .description("Update user and repository data")
.action(updateCommand); .action(updateCommand);
program program
.command('blog <title>') .command("ui")
.description('Create blog with specified title') .description("Create and Manage blogs with ease")
.option('-s, --subtitle [subtitle]', 'give blog a subtitle', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.') .action(uiCommand);
.option('-p, --pagetitle [pagetitle]', 'give blog page a title')
.option('-f, --folder [folder]', 'give folder a title (use "-" instead of spaces)')
.action(blogCommand);
program program
.command('run') .command("run")
.description('Run build files') .description("Run build files")
.option("-p, --port [port]", "provide a port for localhost, default is 3000")
.action(runCommand); .action(runCommand);
program.on('command:*', () => { program.on("command:*", () => {
console.log('Unknown Command: ' + program.args.join(' ')) console.log("Unknown Command: " + program.args.join(" "));
program.help() program.help();
}); });
program program
.version(version, '-v --version') .version(version, "-v --version")
.usage('<command> [options]') .usage("<command> [options]")
.parse(process.argv); .parse(process.argv);
if (program.args.length === 0) program.help(); if (program.args.length === 0) program.help();

View file

@ -1,16 +1,16 @@
/* Filepath utilities */ /* Filepath utilities */
const path = require('path'); const path = require("path");
/* Promise library */ /* Promise library */
const bluebird = require('bluebird'); const bluebird = require("bluebird");
const hbs = require('handlebars'); const hbs = require("handlebars");
/* Creates promise-returning async functions /* Creates promise-returning async functions
from callback-passed async functions */ from callback-passed async functions */
const fs = bluebird.promisifyAll(require('fs')); const fs = bluebird.promisifyAll(require("fs"));
const { updateHTML } = require('./populate'); const { updateHTML } = require("./populate");
const { getConfig, outDir } = require('./utils'); const { getConfig, outDir } = require("./utils");
const assetDir = path.resolve(`${__dirname}/assets/`); const assetDir = path.resolve(`${__dirname}/assets/`);
const config = path.join(outDir, 'config.json'); const config = path.join(outDir, "config.json");
/** /**
* Creates the stylesheet used by the site from a template stylesheet. * Creates the stylesheet used by the site from a template stylesheet.
@ -19,15 +19,13 @@ const config = path.join(outDir, 'config.json');
* arguments. * arguments.
*/ */
async function populateCSS({ async function populateCSS({
theme = 'light', theme = "light",
background = 'https://images.unsplash.com/photo-1553748024-d1b27fb3f960?w=500&h=1000&q=80&fit=crop', background = "https://images.unsplash.com/photo-1553748024-d1b27fb3f960?w=1500&q=80"
} = {}) { } = {}) {
/* Get the theme the user requests. Defaults to 'light' */ /* Get the theme the user requests. Defaults to 'light' */
theme = `${theme}.css`; theme = `${theme}.css`;
let template = path.resolve(assetDir, 'index.css'); let template = path.resolve(assetDir, "index.css");
let stylesheet = path.join(outDir, 'index.css'); let stylesheet = path.join(outDir, "index.css");
let serviceWorker = path.resolve(assetDir, 'service-worker.js');
try { try {
await fs.accessAsync(outDir, fs.constants.F_OK); await fs.accessAsync(outDir, fs.constants.F_OK);
@ -37,33 +35,38 @@ async function populateCSS({
/* Copy over the template CSS stylesheet */ /* Copy over the template CSS stylesheet */
await fs.copyFileAsync(template, stylesheet); await fs.copyFileAsync(template, stylesheet);
/* Add Service Worker */
await fs.copyFileSync(serviceWorker, `${outDir}/service-worker.js`);
/* Get an array of every available theme */ /* Get an array of every available theme */
let themes = await fs.readdirAsync(path.join(assetDir, 'themes')); let themes = await fs.readdirAsync(path.join(assetDir, "themes"));
if (!themes.includes(theme)) { if (!themes.includes(theme)) {
console.error('Error: Requested theme not found. Defaulting to "light".'); console.error('Error: Requested theme not found. Defaulting to "light".');
theme = 'light'; theme = "light";
} }
/* Read in the theme stylesheet */ /* Read in the theme stylesheet */
let themeSource = await fs.readFileSync(path.join(assetDir, 'themes', theme)); let themeSource = await fs.readFileSync(path.join(assetDir, "themes", theme));
themeSource = themeSource.toString('utf-8'); themeSource = themeSource.toString("utf-8");
let themeTemplate = hbs.compile(themeSource); let themeTemplate = hbs.compile(themeSource);
let styles = themeTemplate({ let styles = themeTemplate({
'background': `${background}` background: `${background}`
}) });
/* Add the user-specified styles to the new stylesheet */ /* Add the user-specified styles to the new stylesheet */
await fs.appendFileAsync(stylesheet, styles); await fs.appendFileAsync(stylesheet, styles);
/* Update the config file with the user's theme choice */ /* Update the config file with the user's theme choice */
const data = await getConfig(); const data = await getConfig();
data[0].theme = theme; data[0].theme = theme;
await fs.writeFileAsync(config, JSON.stringify(data, null, ' ')); await fs.writeFileAsync(config, JSON.stringify(data, null, " "));
} }
async function populateConfig(sort, order, includeFork, twitter, linkedin, medium) { async function populateConfig(
sort,
order,
includeFork,
twitter,
linkedin,
medium,
dribbble
) {
const data = await getConfig(); const data = await getConfig();
data[0].sort = sort; data[0].sort = sort;
data[0].order = order; data[0].order = order;
@ -71,21 +74,42 @@ async function populateConfig(sort, order, includeFork, twitter, linkedin, mediu
data[0].twitter = twitter; // added twitter data[0].twitter = twitter; // added twitter
data[0].linkedin = linkedin; // added linkedin data[0].linkedin = linkedin; // added linkedin
data[0].medium = medium; // added medium data[0].medium = medium; // added medium
await fs.writeFileAsync(config, JSON.stringify(data, null, ' ')); data[0].dribbble = dribbble; // added dribbble
await fs.writeFileAsync(config, JSON.stringify(data, null, " "));
} }
async function buildCommand(username, program) { async function buildCommand(username, program) {
await populateCSS(program); await populateCSS(program);
let sort = program.sort ? program.sort : 'created'; let sort = program.sort ? program.sort : "created";
let order = program.order ? program.order : "asc"; let order = program.order ? program.order : "asc";
let includeFork = program.fork ? true : false; let includeFork = program.fork ? true : false;
let twitter = program.twitter ? program.twitter : null; let twitter = program.twitter ? program.twitter : null;
let linkedin = program.linkedin ? program.linkedin : null; let linkedin = program.linkedin ? program.linkedin : null;
let medium = program.medium ? program.medium : null; let medium = program.medium ? program.medium : null;
await populateConfig(sort, order, includeFork, twitter, linkedin, medium); let dribbble = program.dribbble ? program.dribbble : null;
updateHTML(('%s', username), sort, order, includeFork, twitter, linkedin, medium); await populateConfig(
sort,
order,
includeFork,
twitter,
linkedin,
medium,
dribbble
);
updateHTML(
("%s", username),
sort,
order,
includeFork,
twitter,
linkedin,
medium,
dribbble
);
} }
module.exports = { module.exports = {
buildCommand buildCommand,
populateCSS,
populateConfig
}; };

439
package-lock.json generated
View file

@ -51,9 +51,9 @@
"integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw=="
}, },
"ajv": { "ajv": {
"version": "6.10.0", "version": "6.10.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
"integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"requires": { "requires": {
"fast-deep-equal": "^2.0.1", "fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0", "fast-json-stable-stringify": "^2.0.0",
@ -66,12 +66,6 @@
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
}, },
"array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
"integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
"optional": true
},
"array-flatten": { "array-flatten": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@ -118,12 +112,6 @@
"tweetnacl": "^0.14.3" "tweetnacl": "^0.14.3"
} }
}, },
"big-integer": {
"version": "1.6.43",
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.43.tgz",
"integrity": "sha512-9dULc9jsKmXl0Aeunug8wbF+58n+hQoFjqClN7WeZwGLh0XJUWyJJ9Ee+Ep+Ql/J9fRsTVaeThp8MhiCCrY0Jg==",
"optional": true
},
"bluebird": { "bluebird": {
"version": "3.5.4", "version": "3.5.4",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz",
@ -153,15 +141,6 @@
} }
} }
}, },
"bplist-parser": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz",
"integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=",
"optional": true,
"requires": {
"big-integer": "^1.6.7"
}
},
"browser-process-hrtime": { "browser-process-hrtime": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz",
@ -186,22 +165,6 @@
"responselike": "^1.0.2" "responselike": "^1.0.2"
} }
}, },
"camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
"integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
"optional": true
},
"camelcase-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
"optional": true,
"requires": {
"camelcase": "^2.0.0",
"map-obj": "^1.0.0"
}
},
"caseless": { "caseless": {
"version": "0.12.0", "version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@ -269,15 +232,6 @@
"cssom": "0.3.x" "cssom": "0.3.x"
} }
}, },
"currently-unhandled": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
"integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
"optional": true,
"requires": {
"array-find-index": "^1.0.1"
}
},
"dashdash": { "dashdash": {
"version": "1.14.1", "version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@ -304,12 +258,6 @@
"ms": "2.0.0" "ms": "2.0.0"
} }
}, },
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"optional": true
},
"decompress-response": { "decompress-response": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
@ -323,17 +271,6 @@
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
}, },
"default-browser-id": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-1.0.4.tgz",
"integrity": "sha1-5Z0JpdFXuCi4dsJoFuYcPSosIDo=",
"optional": true,
"requires": {
"bplist-parser": "^0.1.0",
"meow": "^3.1.0",
"untildify": "^2.0.0"
}
},
"defer-to-connect": { "defer-to-connect": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz",
@ -381,6 +318,11 @@
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
}, },
"ejs": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz",
"integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q=="
},
"encodeurl": { "encodeurl": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@ -394,15 +336,6 @@
"once": "^1.4.0" "once": "^1.4.0"
} }
}, },
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"optional": true,
"requires": {
"is-arrayish": "^0.2.1"
}
},
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -523,16 +456,6 @@
"unpipe": "~1.0.0" "unpipe": "~1.0.0"
} }
}, },
"find-up": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
"optional": true,
"requires": {
"path-exists": "^2.0.0",
"pinkie-promise": "^2.0.0"
}
},
"forever-agent": { "forever-agent": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@ -558,12 +481,6 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
}, },
"get-stdin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
"integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
"optional": true
},
"get-stream": { "get-stream": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
@ -603,12 +520,6 @@
"url-parse-lax": "^3.0.0" "url-parse-lax": "^3.0.0"
} }
}, },
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
"optional": true
},
"handlebars": { "handlebars": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
@ -634,12 +545,6 @@
"har-schema": "^2.0.0" "har-schema": "^2.0.0"
} }
}, },
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
"integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
"optional": true
},
"html-encoding-sniffer": { "html-encoding-sniffer": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
@ -683,15 +588,6 @@
"safer-buffer": ">= 2.1.2 < 3" "safer-buffer": ">= 2.1.2 < 3"
} }
}, },
"indent-string": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
"integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
"optional": true,
"requires": {
"repeating": "^2.0.0"
}
},
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
@ -702,37 +598,11 @@
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
}, },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"optional": true
},
"is-finite": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
"integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
},
"is-typedarray": { "is-typedarray": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
}, },
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"optional": true
},
"is-wsl": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
"integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
},
"isstream": { "isstream": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@ -824,19 +694,6 @@
"type-check": "~0.3.2" "type-check": "~0.3.2"
} }
}, },
"load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"optional": true,
"requires": {
"graceful-fs": "^4.1.2",
"parse-json": "^2.2.0",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0",
"strip-bom": "^2.0.0"
}
},
"lodash": { "lodash": {
"version": "4.17.14", "version": "4.17.14",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz",
@ -847,58 +704,16 @@
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
}, },
"loud-rejection": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
"integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
"optional": true,
"requires": {
"currently-unhandled": "^0.4.1",
"signal-exit": "^3.0.0"
}
},
"lowercase-keys": { "lowercase-keys": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
}, },
"map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
"optional": true
},
"media-typer": { "media-typer": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
}, },
"meow": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
"optional": true,
"requires": {
"camelcase-keys": "^2.0.0",
"decamelize": "^1.1.2",
"loud-rejection": "^1.0.0",
"map-obj": "^1.0.1",
"minimist": "^1.1.3",
"normalize-package-data": "^2.3.4",
"object-assign": "^4.0.1",
"read-pkg-up": "^1.0.1",
"redent": "^1.0.0",
"trim-newlines": "^1.0.0"
},
"dependencies": {
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"optional": true
}
}
},
"merge-descriptors": { "merge-descriptors": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@ -957,29 +772,11 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
"integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
}, },
"normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"optional": true,
"requires": {
"hosted-git-info": "^2.1.4",
"resolve": "^1.10.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
"normalize-url": { "normalize-url": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
"integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
}, },
"number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"optional": true
},
"nwsapi": { "nwsapi": {
"version": "2.1.4", "version": "2.1.4",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz",
@ -990,12 +787,6 @@
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
}, },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"optional": true
},
"on-finished": { "on-finished": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@ -1012,14 +803,6 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"open": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/open/-/open-6.3.0.tgz",
"integrity": "sha512-6AHdrJxPvAXIowO/aIaeHZ8CeMdDf7qCyRNq8NwJpinmCdXhz+NZR7ie1Too94lpciCDsG+qHGO9Mt0svA4OqA==",
"requires": {
"is-wsl": "^1.1.0"
}
},
"optimist": { "optimist": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
@ -1049,26 +832,11 @@
"wordwrap": "~1.0.0" "wordwrap": "~1.0.0"
} }
}, },
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"optional": true
},
"p-cancelable": { "p-cancelable": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
}, },
"parse-json": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
"optional": true,
"requires": {
"error-ex": "^1.2.0"
}
},
"parse5": { "parse5": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
@ -1079,63 +847,16 @@
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
}, },
"path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"optional": true,
"requires": {
"pinkie-promise": "^2.0.0"
}
},
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"optional": true
},
"path-to-regexp": { "path-to-regexp": {
"version": "0.1.7", "version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
}, },
"path-type": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"optional": true,
"requires": {
"graceful-fs": "^4.1.2",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0"
}
},
"performance-now": { "performance-now": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
}, },
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"optional": true
},
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
"optional": true
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"optional": true,
"requires": {
"pinkie": "^2.0.0"
}
},
"pn": { "pn": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
@ -1200,46 +921,6 @@
"unpipe": "1.0.0" "unpipe": "1.0.0"
} }
}, },
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"optional": true,
"requires": {
"load-json-file": "^1.0.0",
"normalize-package-data": "^2.3.2",
"path-type": "^1.0.0"
}
},
"read-pkg-up": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
"optional": true,
"requires": {
"find-up": "^1.0.0",
"read-pkg": "^1.0.0"
}
},
"redent": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
"integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
"optional": true,
"requires": {
"indent-string": "^2.1.0",
"strip-indent": "^1.0.1"
}
},
"repeating": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
"optional": true,
"requires": {
"is-finite": "^1.0.0"
}
},
"request": { "request": {
"version": "2.88.0", "version": "2.88.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
@ -1301,15 +982,6 @@
"tough-cookie": "^2.3.3" "tough-cookie": "^2.3.3"
} }
}, },
"resolve": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz",
"integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==",
"optional": true,
"requires": {
"path-parse": "^1.0.6"
}
},
"responselike": { "responselike": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
@ -1336,12 +1008,6 @@
"xmlchars": "^1.3.1" "xmlchars": "^1.3.1"
} }
}, },
"semver": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
"optional": true
},
"send": { "send": {
"version": "0.17.1", "version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@ -1385,49 +1051,11 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
}, },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"optional": true
},
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
}, },
"spdx-correct": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
"integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
"optional": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-exceptions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
"integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
"optional": true
},
"spdx-expression-parse": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
"integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
"optional": true,
"requires": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-license-ids": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
"integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
"optional": true
},
"sshpk": { "sshpk": {
"version": "1.16.1", "version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
@ -1454,24 +1082,6 @@
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
}, },
"strip-bom": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
"optional": true,
"requires": {
"is-utf8": "^0.2.0"
}
},
"strip-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
"integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
"optional": true,
"requires": {
"get-stdin": "^4.0.1"
}
},
"symbol-tree": { "symbol-tree": {
"version": "3.2.2", "version": "3.2.2",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
@ -1504,12 +1114,6 @@
"punycode": "^2.1.0" "punycode": "^2.1.0"
} }
}, },
"trim-newlines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
"integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
"optional": true
},
"tunnel-agent": { "tunnel-agent": {
"version": "0.6.0", "version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@ -1555,15 +1159,6 @@
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
}, },
"untildify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
"integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
"optional": true,
"requires": {
"os-homedir": "^1.0.0"
}
},
"uri-js": { "uri-js": {
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@ -1590,16 +1185,6 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
}, },
"validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"optional": true,
"requires": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
}
},
"vary": { "vary": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@ -1679,14 +1264,6 @@
"async-limiter": "~1.0.0" "async-limiter": "~1.0.0"
} }
}, },
"x-default-browser": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz",
"integrity": "sha1-cM8NqF2nwKtcsPFaiX8jIqa91IE=",
"requires": {
"default-browser-id": "^1.0.4"
}
},
"xml-name-validator": { "xml-name-validator": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",

View file

@ -33,14 +33,14 @@
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"bluebird": "^3.5.4", "bluebird": "^3.5.4",
"body-parser": "^1.19.0",
"commander": "^2.20.0", "commander": "^2.20.0",
"ejs": "^2.6.2",
"express": "^4.17.0", "express": "^4.17.0",
"github-emoji": "^1.1.0", "github-emoji": "^1.1.0",
"got": "^9.6.0", "got": "^9.6.0",
"handlebars": "^4.1.2", "handlebars": "^4.1.2",
"jsdom": "^15.1.0", "jsdom": "^15.1.0",
"ncp": "^2.0.0", "ncp": "^2.0.0"
"open": "^6.3.0",
"x-default-browser": "^0.4.0"
} }
} }

View file

@ -1,16 +1,16 @@
const fs = require('fs'); const fs = require("fs");
const got = require('got'); const got = require("got");
const emoji = require('github-emoji'); const emoji = require("github-emoji");
const jsdom = require('jsdom').JSDOM, const jsdom = require("jsdom").JSDOM,
options = { options = {
resources: "usable" resources: "usable"
}; };
const { getConfig, outDir } = require('./utils'); const { getConfig, outDir } = require("./utils");
function convertToEmoji(text) { function convertToEmoji(text) {
if (text == null) return; if (text == null) return;
text = text.toString(); text = text.toString();
var pattern = /(?<=:\s*).*?(?=\s*:)/gs var pattern = /(?<=:\s*).*?(?=\s*:)/gs;
if (text.match(pattern) != null) { if (text.match(pattern) != null) {
var str = text.match(pattern); var str = text.match(pattern);
str = str.filter(function(arr) { str = str.filter(function(arr) {
@ -19,8 +19,14 @@ function convertToEmoji(text) {
for (i = 0; i < str.length; i++) { for (i = 0; i < str.length; i++) {
if (emoji.URLS[str[i]] != undefined) { if (emoji.URLS[str[i]] != undefined) {
var output = emoji.of(str[i]); var output = emoji.of(str[i]);
var emojiImage = output.url.replace("assets-cdn.github", "github.githubassets"); var emojiImage = output.url.replace(
text = text.replace(`:${str[i]}:`, `<img src="${emojiImage}" class="emoji">`); "assets-cdn.github",
"github.githubassets"
);
text = text.replace(
`:${str[i]}:`,
`<img src="${emojiImage}" class="emoji">`
);
} }
} }
return text; return text;
@ -29,10 +35,22 @@ function convertToEmoji(text) {
} }
} }
module.exports.updateHTML = (username, sort, order, includeFork, twitter, linkedin, medium) => { module.exports.updateHTML = (
username,
sort,
order,
includeFork,
twitter,
linkedin,
medium,
dribbble
) => {
//add data to assets/index.html //add data to assets/index.html
jsdom.fromFile(`${__dirname}/assets/index.html`, options).then(function (dom) { jsdom
let window = dom.window, document = window.document; .fromFile(`${__dirname}/assets/index.html`, options)
.then(function(dom) {
let window = dom.window,
document = window.document;
(async () => { (async () => {
try { try {
console.log("Building HTML/CSS..."); console.log("Building HTML/CSS...");
@ -41,7 +59,9 @@ module.exports.updateHTML = (username, sort, order, includeFork, twitter, linked
var page = 1; var page = 1;
if (sort == "star") { if (sort == "star") {
do { do {
tempRepos = await got(`https://api.github.com/users/${username}/repos?per_page=100&page=${page++}`); tempRepos = await got(
`https://api.github.com/users/${username}/repos?per_page=100&page=${page++}`
);
tempRepos = JSON.parse(tempRepos.body); tempRepos = JSON.parse(tempRepos.body);
repos = repos.concat(tempRepos); repos = repos.concat(tempRepos);
} while (tempRepos.length == 100); } while (tempRepos.length == 100);
@ -56,7 +76,9 @@ module.exports.updateHTML = (username, sort, order, includeFork, twitter, linked
} }
} else { } else {
do { do {
tempRepos = await got(`https://api.github.com/users/${username}/repos?sort=${sort}&order=${order}&per_page=100&page=${page++}`); tempRepos = await got(
`https://api.github.com/users/${username}/repos?sort=${sort}&order=${order}&per_page=100&page=${page++}`
);
tempRepos = JSON.parse(tempRepos.body); tempRepos = JSON.parse(tempRepos.body);
repos = repos.concat(tempRepos); repos = repos.concat(tempRepos);
} while (tempRepos.length == 100); } while (tempRepos.length == 100);
@ -68,12 +90,26 @@ module.exports.updateHTML = (username, sort, order, includeFork, twitter, linked
<section> <section>
<div class="section_title">${repos[i].name}</div> <div class="section_title">${repos[i].name}</div>
<div class="about_section"> <div class="about_section">
<span style="display:${repos[i].description == undefined ? 'none' : 'block'};">${convertToEmoji(repos[i].description)}</span> <span style="display:${
repos[i].description == undefined
? "none"
: "block"
};">${convertToEmoji(repos[i].description)}</span>
</div> </div>
<div class="bottom_section"> <div class="bottom_section">
<span style="display:${repos[i].language == null ? 'none' : 'inline-block'};"><i class="fas fa-code"></i>&nbsp; ${repos[i].language}</span> <span style="display:${
<span><i class="fas fa-star"></i>&nbsp; ${repos[i].stargazers_count}</span> repos[i].language == null
<span><i class="fas fa-code-branch"></i>&nbsp; ${repos[i].forks_count}</span> ? "none"
: "inline-block"
};"><i class="fas fa-code"></i>&nbsp; ${
repos[i].language
}</span>
<span><i class="fas fa-star"></i>&nbsp; ${
repos[i].stargazers_count
}</span>
<span><i class="fas fa-code-branch"></i>&nbsp; ${
repos[i].forks_count
}</span>
</div> </div>
</section> </section>
</a>`; </a>`;
@ -83,14 +119,32 @@ module.exports.updateHTML = (username, sort, order, includeFork, twitter, linked
document.getElementById("forks_section").innerHTML += ` document.getElementById("forks_section").innerHTML += `
<a href="${repos[i].html_url}" target="_blank"> <a href="${repos[i].html_url}" target="_blank">
<section> <section>
<div class="section_title">${repos[i].name}</div> <div class="section_title">${
repos[i].name
}</div>
<div class="about_section"> <div class="about_section">
<span style="display:${repos[i].description == undefined ? 'none' : 'block'};">${convertToEmoji(repos[i].description)}</span> <span style="display:${
repos[i].description == undefined
? "none"
: "block"
};">${convertToEmoji(
repos[i].description
)}</span>
</div> </div>
<div class="bottom_section"> <div class="bottom_section">
<span style="display:${repos[i].language == null ? 'none' : 'inline-block'};"><i class="fas fa-code"></i>&nbsp; ${repos[i].language}</span> <span style="display:${
<span><i class="fas fa-star"></i>&nbsp; ${repos[i].stargazers_count}</span> repos[i].language == null
<span><i class="fas fa-code-branch"></i>&nbsp; ${repos[i].forks_count}</span> ? "none"
: "inline-block"
};"><i class="fas fa-code"></i>&nbsp; ${
repos[i].language
}</span>
<span><i class="fas fa-star"></i>&nbsp; ${
repos[i].stargazers_count
}</span>
<span><i class="fas fa-code-branch"></i>&nbsp; ${
repos[i].forks_count
}</span>
</div> </div>
</section> </section>
</a>`; </a>`;
@ -105,38 +159,82 @@ module.exports.updateHTML = (username, sort, order, includeFork, twitter, linked
icon.setAttribute("href", user.avatar_url); icon.setAttribute("href", user.avatar_url);
icon.setAttribute("type", "image/png"); icon.setAttribute("type", "image/png");
document.getElementsByTagName("head")[0].appendChild(icon); document.getElementsByTagName("head")[0].appendChild(icon);
document.getElementById("profile_img").style.background = `url('${user.avatar_url}') center center` document.getElementById("profile_img").style.background = `url('${
document.getElementById("username").innerHTML = `<span style="display:${user.name == null || !user.name ? 'none' : 'block'};">${user.name}</span><a href="${user.html_url}">@${user.login}</a>`; user.avatar_url
}') center center`;
document.getElementById(
"username"
).innerHTML = `<span style="display:${
user.name == null || !user.name ? "none" : "block"
};">${user.name}</span><a href="${user.html_url}">@${user.login}</a>`;
//document.getElementById("github_link").href = `https://github.com/${user.login}`; //document.getElementById("github_link").href = `https://github.com/${user.login}`;
document.getElementById("userbio").innerHTML = convertToEmoji(user.bio); document.getElementById("userbio").innerHTML = convertToEmoji(
document.getElementById("userbio").style.display = user.bio == null || !user.bio ? 'none' : 'block'; user.bio
);
document.getElementById("userbio").style.display =
user.bio == null || !user.bio ? "none" : "block";
document.getElementById("about").innerHTML = ` document.getElementById("about").innerHTML = `
<span style="display:${user.company == null || !user.company ? 'none' : 'block'};"><i class="fas fa-users"></i> &nbsp; ${user.company}</span> <span style="display:${
<span style="display:${user.email == null || !user.email ? 'none' : 'block'};"><i class="fas fa-envelope"></i> &nbsp; ${user.email}</span> user.company == null || !user.company ? "none" : "block"
<span style="display:${user.blog == null || !user.blog ? 'none' : 'block'};"><i class="fas fa-link"></i> &nbsp; <a href="${user.blog}">${user.blog}</a></span> };"><i class="fas fa-users"></i> &nbsp; ${user.company}</span>
<span style="display:${twitter == null ? 'none' : 'block'};"><i class="fab fa-twitter-square"></i> &nbsp;&nbsp; <a href="https://www.twitter.com/${twitter}" target="_blank" class="socials"> Twitter</a></span> <span style="display:${
<span style="display:${linkedin == null ? 'none' : 'block'};"><i class="fab fa-linkedin"></i> &nbsp;&nbsp; <a href="https://www.linkedin.com/in/${linkedin}/" target="_blank" class="socials"> LinkedIn</a></span> user.email == null || !user.email ? "none" : "block"
<span style="display:${medium == null ? 'none' : 'block'};"><i class="fab fa-medium"></i> &nbsp;&nbsp; <a href="https://www.medium.com/@${medium}/" target="_blank" class="socials"> Medium</a></span> };"><i class="fas fa-envelope"></i> &nbsp; ${user.email}</span>
<span style="display:${user.location == null || !user.location ? 'none' : 'block'};"><i class="fas fa-map-marker-alt"></i> &nbsp;&nbsp; ${user.location}</span> <span style="display:${
<span style="display:${user.hireable == false || !user.hireable ? 'none' : 'block'};"><i class="fas fa-user-tie"></i> &nbsp;&nbsp; Available for hire</span>`; user.blog == null || !user.blog ? "none" : "block"
};"><i class="fas fa-link"></i> &nbsp; <a href="${user.blog}">${
user.blog
}</a></span>
<span style="display:${
user.location == null || !user.location ? "none" : "block"
};"><i class="fas fa-map-marker-alt"></i> &nbsp;&nbsp; ${
user.location
}</span>
<span style="display:${
user.hireable == false || !user.hireable ? "none" : "block"
};"><i class="fas fa-user-tie"></i> &nbsp;&nbsp; Available for hire</span>
<div class="socials">
<span style="display:${
twitter == null ? "none !important" : "block"
};"><a href="https://www.twitter.com/${twitter}" target="_blank" class="socials"><i class="fab fa-twitter"></i></a></span>
<span style="display:${
dribbble == null ? "none !important" : "block"
};"><a href="https://www.dribbble.com/${dribbble}" target="_blank" class="socials"><i class="fab fa-dribbble"></i></a></span>
<span style="display:${
linkedin == null ? "none !important" : "block"
};"><a href="https://www.linkedin.com/in/${linkedin}/" target="_blank" class="socials"><i class="fab fa-linkedin-in"></i></a></span>
<span style="display:${
medium == null ? "none !important" : "block"
};"><a href="https://www.medium.com/@${medium}/" target="_blank" class="socials"><i class="fab fa-medium-m"></i></a></span>
</div>`;
//add data to config.json //add data to config.json
const data = await getConfig(); const data = await getConfig();
data[0].username = user.login; data[0].username = user.login;
data[0].name = user.name; data[0].name = user.name;
data[0].userimg = user.avatar_url; data[0].userimg = user.avatar_url;
await fs.writeFile(`${outDir}/config.json`, JSON.stringify(data, null, ' '), function (err) { await fs.writeFile(
`${outDir}/config.json`,
JSON.stringify(data, null, " "),
function(err) {
if (err) throw err; if (err) throw err;
console.log("Config file updated."); console.log("Config file updated.\n");
}); }
await fs.writeFile(`${outDir}/index.html`, '<!DOCTYPE html>' + window.document.documentElement.outerHTML, function (error) { );
await fs.writeFile(
`${outDir}/index.html`,
"<!DOCTYPE html>" + window.document.documentElement.outerHTML,
function(error) {
if (error) throw error; if (error) throw error;
console.log(`Build Complete, Files can be Found @ ${outDir}`); console.log(`Build Complete, Files can be Found @ ${outDir}\n`);
}); }
);
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
})(); })();
}).catch(function (error) { })
.catch(function(error) {
console.log(error); console.log(error);
}); });
} };

29
run.js
View file

@ -1,25 +1,20 @@
const express = require('express'); const express = require("express");
const open = require('open'); const path = require("path");
const defaultBrowser = require('x-default-browser'); const outDir = path.resolve("./dist/" || process.env.OUT_DIR);
const path = require('path');
const outDir = path.resolve('./dist/' || process.env.OUT_DIR);
const app = express(); const app = express();
app.use(express.static(`${outDir}`)); app.use(express.static(`${outDir}`));
function runCommand(){ function runCommand(program) {
app.get('/',function(req,res){ let port = program.port ? program.port : 3000;
res.sendFile('/index.html');
app.get("/", function(req, res) {
res.sendFile("/index.html");
}); });
app.listen(3000); app.listen(port);
console.log(
defaultBrowser(function (err, res) { `\nGitfolio running on port ${port}, Navigate to http://localhost:${port} in your browser\n`
if(err) throw err; );
(async () => {
await open('http://localhost:3000', {app: res.commonName});
console.log("ctrl + c to exit");
})();
});
} }
module.exports = { module.exports = {

222
ui.js Normal file
View file

@ -0,0 +1,222 @@
const fs = require("fs");
const express = require("express");
let bodyParser = require("body-parser");
const { updateHTML } = require("./populate");
const { populateCSS, populateConfig } = require("./build");
const { updateCommand } = require("./update");
const app = express();
app.set("view engine", "ejs");
app.use(express.static("views"));
app.set("views", __dirname + "/views");
app.use(express.json({ limit: "50mb" }));
app.use(express.urlencoded({ limit: "50mb", extended: true }));
const port = 3000;
const jsdom = require("jsdom").JSDOM,
options = {
resources: "usable"
};
global.DOMParser = new jsdom().window.DOMParser;
const { getBlog, outDir } = require("./utils");
function createBlog(title, subtitle, folder, topImage, images, content) {
// Checks to make sure this directory actually exists
// and creates it if it doesn't
if (!fs.existsSync(`${outDir}/blog/`)) {
fs.mkdirSync(`${outDir}/blog/`, { recursive: true }, err => {});
}
if (!fs.existsSync(`${outDir}/blog/${folder}`)) {
fs.mkdirSync(`${outDir}/blog/${folder}`, { recursive: true });
}
fs.copyFile(
`${__dirname}/assets/blog/blogTemplate.html`,
`${outDir}/blog/${folder}/index.html`,
err => {
if (err) throw err;
jsdom
.fromFile(`${outDir}/blog/${folder}/index.html`, options)
.then(function(dom) {
let window = dom.window,
document = window.document;
let style = document.createElement("link");
style.setAttribute("rel", "stylesheet");
style.setAttribute("href", "../../index.css");
document.getElementsByTagName("head")[0].appendChild(style);
document.getElementsByTagName("title")[0].textContent = title;
document.getElementById("blog_title").textContent = title;
document.getElementById("blog_sub_title").textContent = subtitle;
document.getElementById(
"background"
).style.background = `url('top_image.${
topImage.split("/")[1].split(";")[0]
}') center center`;
if (content != null) {
var parser = new DOMParser();
content = parser.parseFromString(content, "text/html");
document.getElementById("blog").innerHTML =
content.documentElement.innerHTML;
}
images = JSON.parse(images);
images.forEach((item, index) => {
var base64Image = item.split(";base64,").pop();
fs.writeFile(
`${outDir}/blog/${folder}/img_${index}.${
item.split("/")[1].split(";")[0]
}`,
base64Image,
{ encoding: "base64" },
function(err) {
if (err) throw err;
}
);
});
fs.writeFile(
`${outDir}/blog/${folder}/index.html`,
"<!DOCTYPE html>" + window.document.documentElement.outerHTML,
async function(error) {
if (error) throw error;
var base64ImageTop = topImage.split(";base64,").pop();
fs.writeFile(
`${outDir}/blog/${folder}/top_image.${
topImage.split("/")[1].split(";")[0]
}`,
base64ImageTop,
{ encoding: "base64" },
function(err) {
if (err) throw err;
}
);
let blog_data = {
url_title: folder,
title: title,
sub_title: subtitle,
top_image: `top_image.${topImage.split("/")[1].split(";")[0]}`,
visible: true
};
const old_blogs = await getBlog();
old_blogs.push(blog_data);
fs.writeFile(
`${outDir}/blog.json`,
JSON.stringify(old_blogs, null, " "),
function(err) {
if (err) throw err;
console.log(
`Blog created successfully at ${outDir}\\blog\\${folder}\n`
);
}
);
}
);
})
.catch(function(error) {
console.log(error);
});
}
);
}
function uiCommand() {
app.get("/", function(req, res) {
res.render("index.ejs");
});
app.get("/update", function(req, res) {
if (!fs.existsSync(`${outDir}/config.json`)) {
return res.send(
'You need to run build command before using update<br><a href="/">Go Back</a>'
);
}
updateCommand();
res.redirect("/");
});
app.post("/build", function(req, res) {
let username = req.body.username;
if (!username) {
return res.send("username can't be empty");
}
let sort = req.body.sort ? req.body.sort : "created";
let order = req.body.order ? req.body.order : "asc";
let includeFork = req.body.fork == "true" ? true : false;
let twitter = req.body.twitter ? req.body.twitter : null;
let linkedin = req.body.linkedin ? req.body.linkedin : null;
let medium = req.body.medium ? req.body.medium : null;
let dribbble = req.body.dribbble ? req.body.dribbble : null;
let background = req.body.background
? req.body.background
: "https://images.unsplash.com/photo-1553748024-d1b27fb3f960?w=1500&q=80";
let theme = req.body.theme == "on" ? "dark" : "light";
updateHTML(
username,
sort,
order,
includeFork,
twitter,
linkedin,
medium,
dribbble
);
populateCSS({ background: background, theme: theme });
populateConfig(
sort,
order,
includeFork,
twitter,
linkedin,
medium,
dribbble
);
res.redirect("/");
});
app.get("/blog", function(req, res) {
if (!fs.existsSync(`${outDir}/config.json`)) {
return res.send(
'You need to run build command before accessing blogs<br><a href="/">Go Back</a>'
);
}
fs.readFile("./dist/config.json", function(err, data) {
res.render("blog.ejs", { profile: JSON.parse(data) });
});
});
app.post("/createBlog", function(req, res) {
let title = req.body.title;
let subtitle = req.body.subtitle;
let content = req.body.content ? req.body.content : null;
if (!title) {
return res.send("title can't be empty");
}
if (!subtitle) {
return res.send("subtitle can't be empty");
}
if (!content) {
return res.send("something isn't working fine, try again :p");
}
let folder = title.replace(/[^a-zA-Z ]/g, "").replace(/ /g, "-");
let topImage = req.body.top_image;
let images = req.body.images;
createBlog(title, subtitle, folder, topImage, images, content);
res.redirect("/blog");
});
console.log("\nStarting...");
app.listen(port);
console.log(
`The GUI is running on port ${port}, Navigate to http://localhost:${port} in your browser\n`
);
}
module.exports = {
uiCommand
};

View file

@ -1,5 +1,5 @@
const {getConfig} = require('./utils'); const { getConfig } = require("./utils");
const {updateHTML} = require('./populate'); const { updateHTML } = require("./populate");
async function updateCommand() { async function updateCommand() {
const data = await getConfig(); const data = await getConfig();
@ -10,11 +10,28 @@ async function updateCommand() {
var twitter = data[0].twitter; var twitter = data[0].twitter;
var linkedin = data[0].linkedin; var linkedin = data[0].linkedin;
var medium = data[0].medium; var medium = data[0].medium;
if(username == null || sort == null || order == null || includeFork == null){ var dribbble = data[0].dribbble;
console.log("username not found in config.json, please run build command before using update"); if (
username == null ||
sort == null ||
order == null ||
includeFork == null
) {
console.log(
"username not found in config.json, please run build command before using update"
);
return; return;
} }
updateHTML(username, sort, order, includeFork, twitter, linkedin, medium); updateHTML(
username,
sort,
order,
includeFork,
twitter,
linkedin,
medium,
dribbble
);
} }
module.exports = { module.exports = {

260
views/blog.ejs Normal file
View file

@ -0,0 +1,260 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Gitfolio UI</title>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css"
/>
<link
rel="stylesheet"
href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"
integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"
crossorigin="anonymous"
/>
<link rel="stylesheet" href="../index.css" />
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/gh/zeva-ui/zeva/dist/css/zeva.min.css"
/>
</head>
<body class="body-light">
<header>
<b>gitfolio</b>
<a href="/blog" style="float: right">New Blog </a>
<a href="/update" style="float: right">Update</a>
<a href="/" style="float: right">Home</a>
</header>
<div id="top_image">
<i class="fas fa-camera" onclick="applyTopImage()"></i>
</div>
<input
type="file"
id="top_image_file"
style="display: none"
accept="image/*"
style="display: none"
/>
<table id="profile_blog">
<tbody>
<tr>
<td style="width:8vw;">
<div
id="profile_img_blog"
style="background:url('<%= profile[0].userimg%>') center center;"
></div>
</td>
<td style="width:52vw;">
<div id="username_blog">
<% if(profile[0].name)%>
<span><%= profile[0].name%></span>
<% %>
<br />@<%= profile[0].username%><b id="blog_time"></b>
</div>
</td>
</tr>
</tbody>
</table>
<div id="blog-display">
<form
style="padding: 0px; width:100%;"
method="POST"
action="/createBlog"
id="form"
>
<textarea
id="blog_title"
placeholder="blog title here"
spellcheck="false"
rows="1"
onkeyup="addRow(event)"
name="title"
required
></textarea>
<br />
<textarea
id="blog_sub_title"
placeholder="blog sub title here"
spellcheck="false"
rows="1"
name="subtitle"
onkeyup="addRow(event)"
required
></textarea>
<div id="originalContent" style="display: none"></div>
<input type="hidden" name="top_image" id="top" />
<input type="hidden" name="content" id="content" />
<input type="hidden" name="images" id="images" />
<div id="blog"></div>
<div class="div_for_buttons">
<input
type="file"
name="file"
id="file"
style="display: none"
accept="image/*"
/>
<button
class="button h-weight-bold h-border-pill -size-small"
type="button"
onclick="clickFile()"
>
<i class="fas fa-plus"></i>&nbsp; Image
</button>
<button
class="button h-weight-bold h-border-pill -size-small"
type="button"
onclick="addPara()"
>
<i class="fas fa-plus"></i>&nbsp; Paragraph
</button>
<h5>Tip : You can use html inside paragraphs</h5>
</div>
<button type="button" class="button" onclick="submitthisform()">
Create Blog
</button>
</form>
</div>
<script
type="text/javascript"
src="https://cdn.jsdelivr.net/gh/zeva-ui/zeva/dist/js/index.min.js"
></script>
<script>
var imgElement = document.querySelector("#file");
var topImageElement = document.querySelector("#top_image_file");
var img_number = 0;
var blog_para_number = 0;
var images = [];
function applyTopImage() {
topImageElement.value = "";
document.querySelector("#top").value = "";
document.querySelector("#top_image").style.background =
"linear-gradient(0deg, rgb(250, 250, 250), rgb(220, 220, 220))";
topImageElement.click();
}
topImageElement.addEventListener("change", e => {
var reader = new FileReader();
reader.readAsDataURL(e.target.files[0]);
reader.onload = data => {
var image = data.target.result;
document.querySelector(
"#top_image"
).style.background = `linear-gradient(0deg, rgba(250, 250, 250, 1), rgba(220, 220, 220, 0)), url('${image}') center center`;
document.querySelector("#top").value = image;
};
});
function addRow(e) {
e.preventDefault();
if (e.target.clientHeight < e.target.scrollHeight) {
e.target.rows += 1;
} else {
if (e.target.value == "") {
e.target.rows = 1;
}
}
}
function remove(e, element, blobData) {
var elem = document.getElementById(element);
var elem2 = document.getElementById(`${element}_original`);
elem.parentNode.removeChild(e.target);
elem.parentNode.removeChild(elem);
elem2.parentNode.removeChild(elem2);
imgElement.value = "";
if (element.split("_")[0] == "img") {
images.splice(images.indexOf(blobData), 1);
img_number--;
}
}
function addDataToOriginalPara(id) {
document.querySelector(
`#para_${id}_original`
).innerHTML = document.querySelector(`#para_${id}`).value;
}
function clickFile() {
imgElement.click();
}
imgElement.addEventListener("change", e => {
var img = document.createElement("img");
var imageblob = URL.createObjectURL(e.target.files[0]);
img.setAttribute(
"src",
`img_${img_number}.${e.target.files[0].type.split("/")[1]}`
);
img.setAttribute("alt", `blog image ${img_number}`);
img.setAttribute("id", `img_${img_number}_original`);
var img2 = document.createElement("img");
img2.setAttribute("src", imageblob);
img2.setAttribute("alt", `blog image ${img_number}`);
img2.setAttribute("id", `img_${img_number}`);
var remove = document.createElement("div");
remove.setAttribute("class", "remove");
remove.setAttribute(
"onclick",
`remove(event,'img_${img_number}', '${imageblob}')`
);
remove.innerHTML = '<i class="fas fa-times"></i> Remove';
document.querySelector("#originalContent").appendChild(img);
document.querySelector("#blog").appendChild(img2);
document.querySelector("#blog").appendChild(remove);
var reader = new FileReader();
reader.readAsDataURL(e.target.files[0]);
reader.onload = data => {
images.push(data.target.result);
console.log(images);
};
imgElement.value = "";
img_number++;
});
function addPara() {
var para = document.createElement("textarea");
para.setAttribute("class", "para");
para.setAttribute("id", `para_${blog_para_number}`);
para.setAttribute("spellcheck", false);
para.setAttribute("rows", 1);
para.setAttribute(
"onkeyup",
`addRow(event), addDataToOriginalPara('${blog_para_number}')`
);
para.setAttribute("required", true);
para.setAttribute("placeholder", "What's on your Mind?");
var remove = document.createElement("div");
remove.setAttribute("class", "remove");
remove.setAttribute(
"onclick",
`remove(event,'para_${blog_para_number}', null)`
);
remove.innerHTML = '<i class="fas fa-times"></i> Remove';
var originalPara = document.createElement("p");
originalPara.setAttribute("id", `para_${blog_para_number}_original`);
document.querySelector("#blog").appendChild(para);
document.querySelector("#blog").appendChild(remove);
document.querySelector("#originalContent").appendChild(originalPara);
blog_para_number++;
}
function submitthisform() {
document.querySelector("#content").value = document.querySelector(
"#originalContent"
).innerHTML;
document.querySelector("#images").value = JSON.stringify(images);
document.querySelector("#form").submit();
}
</script>
</body>
</html>

BIN
views/font/Circular.otf Normal file

Binary file not shown.

299
views/index.css Normal file
View file

@ -0,0 +1,299 @@
@import url("https://fonts.googleapis.com/css?family=Poppins");
@import url("https://fonts.googleapis.com/css?family=Questrial");
@font-face {
font-family: "Circular";
src: url("./font/Circular.otf");
}
body {
margin: 0%;
padding: 0%;
width: 100vw;
max-width: 100vw;
overflow-x: hidden;
align-items: center;
font-family: "Poppins", sans-serif;
background: rgb(250, 250, 250) !important;
will-change: auto;
}
header {
width: 90vw;
padding: 4vh 5vw;
font-weight: bold;
background: rgb(255, 255, 255);
font-size: 32px;
}
header b {
font-family: "Circular", sans-serif;
}
header a {
font-size: 16px;
margin: 1.8vh 0px;
margin-left: 4vw;
color: #000;
text-decoration: none;
transition: 0.4s ease-in-out;
}
header a:hover {
color: #bebebe;
}
form {
width: 90vw;
padding: 2vh 5vw;
}
form .button {
margin: 2vh 0px;
}
.input {
margin: 1.5vh 0px !important;
}
.label {
display: inline-block !important;
margin-right: 25px;
font-weight: bold;
}
button {
transition: 0.4s ease-in-out !important;
}
button:hover {
color: #fff;
background: #000 !important;
}
.-size-small {
margin-right: 1vw !important;
}
#top_image {
width: 100vw;
height: 50vh;
position: absolute;
top: 14vh;
left: 0;
background: linear-gradient(0deg, rgb(250, 250, 250), rgb(200, 200, 200));
background-size: cover !important;
background-repeat: no-repeat !important;
z-index: 1;
text-align: right;
}
#top_image i {
font-size: 20px;
position: absolute;
z-index: 5;
top: 4vh;
right: 5vw;
padding: 15px 15px;
background: #ffffff;
color: rgb(0, 0, 0);
border-radius: 50%;
}
#top_image i:hover {
cursor: pointer;
}
#profile_blog {
width: 60vw;
margin: 0px 20vw;
margin-top: 42vh !important;
text-align: left;
z-index: 1;
transition: 0.4s ease-in-out;
z-index: 2;
position: relative;
}
#profile_img_blog {
border-radius: 50%;
width: 90px;
height: 90px;
background-size: cover !important;
background-repeat: no-repeat;
}
#username_blog {
font-size: 18px;
color: #000;
font-family: "Poppins", sans-serif;
font-weight: bold;
padding-left: 0px;
}
#username_blog span {
font-size: 24px;
font-family: "Questrial", sans-serif !important;
}
#username_blog b {
font-size: 12px;
font-family: "Poppins", sans-serif;
font-weight: bold;
}
#blog-display {
width: 60vw;
margin: 3vh 20vw;
text-align: left;
z-index: 1;
transition: 0.4s ease-in-out;
z-index: 2;
position: relative;
}
#blog_title {
font-size: 50px;
color: #000;
font-weight: bold;
font-family: "Questrial", sans-serif;
background: transparent;
border: 0px;
width: 100%;
resize: none;
height: auto;
overflow-y: hidden;
}
#blog_sub_title {
font-size: 36px;
color: rgb(100, 100, 100);
font-weight: bold;
font-family: "Questrial", sans-serif;
background: transparent;
border: 0px;
width: 100%;
resize: none;
height: auto;
overflow-y: hidden;
}
#blog_sub_title::placeholder {
color: rgb(100, 100, 100);
}
#blog-display h2 {
color: var(--blog-gray-color);
}
#blog-display {
padding: 1vh 0px;
font-family: "Questrial", sans-serif;
}
.div_for_buttons {
margin-top: 5vh;
}
.para {
font-size: 17px;
line-height: 25px;
word-spacing: 1.2px;
margin: 5vh 0px;
background: transparent;
border: 0px;
width: 100%;
font-family: "Questrial", sans-serif;
resize: none;
height: auto;
overflow-y: hidden;
}
.para span {
padding: 2px 4px;
background: #000;
color: #fff !important;
}
#blog {
margin-top: 2vh;
}
#blog img {
width: 100%;
margin: 2vh 0px;
border-radius: 5px;
border: 1px solid rgb(0, 0, 0, 0.08);
}
.remove {
margin-bottom: 2vh 0px;
font-weight: bold;
transition: 0.4s ease-in-out;
font-size: 16px;
}
.remove i {
font-size: 14px;
margin-right: 3px;
}
.remove:hover {
cursor: pointer;
color: rgb(255, 70, 70);
}
@media (max-width: 800px) {
#blog-display {
width: 90vw;
margin: 0px 5vw;
text-align: left;
margin-top: 0vh;
z-index: 1;
}
#profile_blog {
width: 90vw;
margin: 0px 5vw;
}
#profile_img_blog {
width: 70px;
height: 70px;
}
#blog img {
margin: 1vh 0px !important;
}
#blog p {
margin: 2vh 0px;
}
}
::selection {
color: #fff;
background: #000;
}
::-webkit-scrollbar {
width: 5px;
height: 5px;
}
::-webkit-scrollbar-track {
background: #fff;
}
::-webkit-scrollbar-thumb {
background: #000;
}
input,
textarea:focus {
outline: none;
}
::placeholder {
color: #000;
}

145
views/index.ejs Normal file
View file

@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Gitfolio UI</title>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css"
/>
<link
rel="stylesheet"
href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"
integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"
crossorigin="anonymous"
/>
<link rel="stylesheet" href="../index.css" />
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/gh/zeva-ui/zeva/dist/css/zeva.min.css"
/>
</head>
<body class="body-light">
<header>
<b>gitfolio</b>
<a href="/blog" style="float: right">New Blog </a>
<a href="/update" style="float: right">Update</a>
<a href="/" style="float: right">Home</a>
</header>
<form method="post" action="build">
<h3>Build or Edit Portfolio</h3>
<input
type="text"
class="input h-weight-bold"
placeholder="username"
id="username"
name="username"
required
/><br />
<input
type="text"
class="input h-weight-bold"
placeholder="background"
name="background"
id="background"
/>
<h3>Sort By :</h3>
<label class="label"
>Star
<input type="radio" name="sort" value="star" />
<span class="radio"></span>
</label>
<label class="label"
>Created
<input type="radio" name="sort" value="created" checked />
<span class="radio"></span>
</label>
<label class="label"
>Updated
<input type="radio" name="sort" value="updated" />
<span class="radio"></span>
</label>
<label class="label"
>Pushed
<input type="radio" name="sort" value="pushed" />
<span class="radio"></span>
</label>
<label class="label"
>Full Name
<input type="radio" name="sort" value="full_name" />
<span class="radio"></span>
</label>
<h3>Order By :</h3>
<label class="label"
>Asc
<input type="radio" name="order" value="asc" checked />
<span class="radio"></span>
</label>
<label class="label"
>Desc
<input type="radio" name="order" value="desc" />
<span class="radio"></span>
</label>
<br /><br />
<label class="label"
>Use Dark Theme
<input type="checkbox" id="theme" name="theme" />
<span class="checkbox"></span>
</label>
<label class="label"
>Include Forks
<input type="checkbox" id="fork" name="fork" value="true" />
<span class="checkbox"></span>
</label>
<label class="label"
>Include Socials
<input type="checkbox" id="socials" name="socials" />
<span class="checkbox"></span>
</label>
<div style="display: none" id="input_for_socials">
<input
type="text"
class="input h-weight-bold"
placeholder="twitter username"
id="twitter"
name="twitter"
/><br />
<input
type="text"
class="input h-weight-bold"
placeholder="medium username"
id="medium"
name="medium"
/><br />
<input
type="text"
class="input h-weight-bold"
placeholder="dribbble username"
id="dribbble"
name="dribbble"
/><br />
<input
type="text"
class="input h-weight-bold"
placeholder="linkedin username"
id="linkedin"
name="linkedin"
/>
</div>
<br /><br />
<button type="submit" class="button" id="build">Build</button>
</form>
<script
type="text/javascript"
src="https://cdn.jsdelivr.net/gh/zeva-ui/zeva/dist/js/index.min.js"
></script>
<script src="./index.js" type="text/javascript"></script>
</body>
</html>

7
views/index.js Normal file
View file

@ -0,0 +1,7 @@
document.querySelector("#socials").addEventListener("change", event => {
if (event.target.checked) {
document.querySelector("#input_for_socials").style.display = "block";
} else {
document.querySelector("#input_for_socials").style.display = "none";
}
});