From f8ac025e80bc174205aacf80a4b78a49e66d2d5c Mon Sep 17 00:00:00 2001 From: Timothy Stewart Date: Mon, 9 Aug 2021 21:58:26 -0500 Subject: [PATCH] =?UTF-8?q?feat(init):=20=E2=9A=A1initial=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 12 ++ .github/FUNDING.yml | 2 + .github/workflows/main.yml | 57 +++++ .gitignore | 23 ++ .nvmrc | 1 + Dockerfile | 16 ++ README.md | 25 +++ app.js | 24 +++ docker-compose.yml | 32 +++ entrypoint.sh | 6 + package.json | 39 ++++ www/css/brands.css | 295 +++++++++++++++++++++++++ www/css/normalize.css | 427 ++++++++++++++++++++++++++++++++++++ www/css/skeleton-dark.css | 177 +++++++++++++++ www/css/skeleton-light.css | 167 ++++++++++++++ www/icons/discord.svg | 3 + www/icons/email.svg | 3 + www/icons/email_alt.svg | 3 + www/icons/facebook.svg | 2 + www/icons/figma.svg | 14 ++ www/icons/github.svg | 2 + www/icons/goodreads.svg | 1 + www/icons/instagram.svg | 3 + www/icons/kit.svg | 11 + www/icons/linkedin.svg | 2 + www/icons/medium.svg | 5 + www/icons/messenger.svg | 3 + www/icons/pinterest.svg | 11 + www/icons/producthunt.svg | 11 + www/icons/reddit.svg | 4 + www/icons/skoob.svg | 1 + www/icons/snapchat.svg | 4 + www/icons/soundcloud.svg | 2 + www/icons/spotify.svg | 2 + www/icons/steam.svg | 2 + www/icons/telegram.svg | 2 + www/icons/tiktok.svg | 12 ++ www/icons/tumblr.svg | 2 + www/icons/twitch.svg | 5 + www/icons/twitter.svg | 10 + www/icons/vimeo.svg | 10 + www/icons/wordpress.svg | 3 + www/icons/youtube.svg | 11 + www/images/avatar.png | Bin 0 -> 1742 bytes www/images/avatar@2x.png | Bin 0 -> 3425 bytes www/index.html | 216 +++++++++++++++++++ www/js/env.js | 341 +++++++++++++++++++++++++++++ yarn.lock | 431 +++++++++++++++++++++++++++++++++++++ 48 files changed, 2435 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 app.js create mode 100644 docker-compose.yml create mode 100755 entrypoint.sh create mode 100644 package.json create mode 100644 www/css/brands.css create mode 100644 www/css/normalize.css create mode 100644 www/css/skeleton-dark.css create mode 100644 www/css/skeleton-light.css create mode 100644 www/icons/discord.svg create mode 100644 www/icons/email.svg create mode 100644 www/icons/email_alt.svg create mode 100644 www/icons/facebook.svg create mode 100644 www/icons/figma.svg create mode 100644 www/icons/github.svg create mode 100644 www/icons/goodreads.svg create mode 100644 www/icons/instagram.svg create mode 100644 www/icons/kit.svg create mode 100644 www/icons/linkedin.svg create mode 100644 www/icons/medium.svg create mode 100644 www/icons/messenger.svg create mode 100644 www/icons/pinterest.svg create mode 100644 www/icons/producthunt.svg create mode 100644 www/icons/reddit.svg create mode 100644 www/icons/skoob.svg create mode 100644 www/icons/snapchat.svg create mode 100644 www/icons/soundcloud.svg create mode 100644 www/icons/spotify.svg create mode 100644 www/icons/steam.svg create mode 100644 www/icons/telegram.svg create mode 100644 www/icons/tiktok.svg create mode 100644 www/icons/tumblr.svg create mode 100644 www/icons/twitch.svg create mode 100644 www/icons/twitter.svg create mode 100644 www/icons/vimeo.svg create mode 100644 www/icons/wordpress.svg create mode 100644 www/icons/youtube.svg create mode 100644 www/images/avatar.png create mode 100644 www/images/avatar@2x.png create mode 100644 www/index.html create mode 100644 www/js/env.js create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..bc298d6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..9602961 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: timothystewart6 +patreon: technotim \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..5550600 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,57 @@ +name: CI for releases + +on: + push: + branches: + - master + +jobs: + js-install-and-test: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [v14.17.4] + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@master + with: + node-version: ${{ matrix.node-version }} + - name: Install Dependencies, Test, and Build + run: | + yarn install --frozen-lockfile --check-files + env: + CI: true + + build-and-push-docker-image: + needs: [js-install-and-test] + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + - + name: Show structure + run: | + ls -R + - + name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - + name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - + name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm64,linux/386 + push: true + tags: timothystewart6/littlelink-server:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..e093aa3 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v14.17.4 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..569f038 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM node:14.17.4-alpine +RUN apk --no-cache add \ + gettext \ + bash +ENV NODE_ENV=production +WORKDIR /usr/src/app +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile --check-files --production=true +COPY www ./www +COPY app.js ./ +COPY ./entrypoint.sh / +RUN chmod +x /entrypoint.sh +EXPOSE 3000 +ENTRYPOINT ["/entrypoint.sh"] +CMD [ "node", "app.js" ] + diff --git a/README.md b/README.md new file mode 100644 index 0000000..7e6f6c6 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# πŸ”— LittleLink-Server + +[![Docker Build Status](https://img.shields.io/docker/pulls/timothystewart6/littlelink-server.svg)](https://hub.docker.com/r/timothystewart6/littlelink-server/) + +This project is based on the great work from [littlelink](https://github.com/sethcottle/littlelink) +It takes the same simple approach to a link page and hosts it within a nodeJS server containerized for you to use. Now, customizing `littlelink` with `littlelink-server` is as easy as passing in some environment variables. + + + +# πŸ‘‡ What is `littlelink`? + +![LittleLink](https://cdn.cottle.cloud/littlelink/social-circle.png) + +LittleLink is a lightweight DIY alternative to services like [Linktree](https://linktr.ee) +and [many.link](https://www.google.com). LittleLink was built using [Skeleton](http://getskeleton.com/), a dead simple, responsive boilerplateβ€”we just stripped out some additional code you wouldn't need and added in branded styles for popular services. 😊 + +![Themes](https://cdn.cottle.cloud/littlelink/themes.png) + +LittleLink has more than 20 company button styles you can use and we'll be throwing more in soon. You'll also find a light and dark theme ready to go. Not a fan of the colors? Update `skeleton-light.css` or `skeleton-dark.css` to the HEX values of your choosing. + +![Performance](https://cdn.cottle.cloud/littlelink/performance.png) + +Using [Skeleton](http://getskeleton.com/) let us build something that loads quickly & doesn't have any of the unnecessary bloat you would get from using a large framework for a page that requires nothing more than simplicity. LittleLink scored a 99/100 in performance when tested with [Google Lighthouse](https://developers.google.com/web/tools/lighthouse). + +![Publish](https://cdn.cottle.cloud/littlelink/fork-edit-publish.png) diff --git a/app.js b/app.js new file mode 100644 index 0000000..cddcb0e --- /dev/null +++ b/app.js @@ -0,0 +1,24 @@ +require('dotenv').config() +const express = require('express') +const helmet = require("helmet"); +const morgan = require('morgan') +const compression = require('compression') + +const app = express(); +app.use( + helmet.contentSecurityPolicy({ + useDefaults: true, + directives: { + "img-src": '* data:', // this is needed to load images off site + }, + }) + ); +app.use(morgan('combined')); +app.use(express.static('www')); +app.use(compression()) + +const server = app.listen(process.env.PORT || 3000, () => { + const host = server.address().address + const port = server.address().port + console.log('Express app listening at http://%s:%s', host, port) +}) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..09afe25 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +--- +# this is used for local development and testing +version: '3.0' +services: + little-link: + build: + context: ./ + dockerfile: Dockerfile + environment: + - META_TITLE=Techno Tim + - META_DESCRIPTION=Techno Tim Link page + - META_AUTHOR=Techno Tim + - THEME=Dark + - FAVICON_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_400x400.jpg + - AVATAR_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_400x400.jpg + - AVATAR_ALT=Techno Tim Profile Pic + - NAME=TechnoTim + - BIO=Hey! Just a place where you can connect with me! + - GITHUB=https://github.com/timothystewart6 + - TWITTER=https://twitter.com/TechnoTimLive + - INSTAGRAM=https://www.instagram.com/techno.tim + - YOUTUBE=https://www.youtube.com/channel/UCOk-gHyjcWZNj3Br4oxwh0A/ + - TWITCH=https://www.twitch.tv/technotim/ + - DISCORD=https://discord.gg/DJKexrJ + - KIT=https://kit.co/TechnoTim + - FOOTER=Thanks for stopping by! + + ports: + - 8080:3000 + restart: unless-stopped + security_opt: + - no-new-privileges:true \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..8d2a918 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/bash +originalfile="/usr/src/app/www/js/env.js" +tmpfile=$(mktemp) +cp --attributes-only --preserve $originalfile $tmpfile +cat $originalfile | envsubst | tee $tmpfile && mv $tmpfile $originalfile +exec "$@" diff --git a/package.json b/package.json new file mode 100644 index 0000000..91c9039 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "littlelink-server", + "version": "1.0.0", + "description": "A server based on littlelink", + "main": "app.js", + "license": "MIT", + "private": true, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node app.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/timothystewart6/littlelink.git" + }, + "keywords": [ + "littlelink", + "linktree", + "linktr.ee", + "javascript", + "open", + "source", + "html", + "css", + "docker" + ], + "author": "Timothy Stewart", + "bugs": { + "url": "https://github.com/timothystewart6/littlelink/issues" + }, + "homepage": "https://github.com/timothystewart6/littlelink#readme", + "dependencies": { + "compression": "^1.7.4", + "dotenv": "^10.0.0", + "express": "^4.17.1", + "helmet": "^4.6.0", + "morgan": "^1.10.0" + } +} diff --git a/www/css/brands.css b/www/css/brands.css new file mode 100644 index 0000000..9741cb0 --- /dev/null +++ b/www/css/brands.css @@ -0,0 +1,295 @@ +/* +* littlelink.io +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + +/* +* Built using on: +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + + +/* Table of contents +–––––––––––––––––––––––––––––––––––––––––––––––––– + +- Buttons +- Brand Styles + +*/ + + +/* Buttons +–––––––––––––––––––––––––––––––––––––––––––––––––– */ + +.button, +button { + display: inline-block; + text-decoration: none; + height: 48px; + text-align: center; + vertical-align: middle; + font-size: 18px; + width: 300px; + font-weight: 700; + line-height: 48px; + letter-spacing: 0.1px; + white-space: wrap; + border-radius: 8px; + cursor: pointer; + } +button:hover, +.button:focus { + color: #333; + border-color: #888; + outline: 0; } +.button.button-primary { + color: #FFF; + filter: brightness(90%) } +.button.button-primary:hover, +.button.button-primary:focus { + color: #FFF; + filter: brightness(90%) } + + +/* Brand Icons +–––––––––––––––––––––––––––––––––––––––––––––––––– */ + +.icon { + padding: 0px 8px 3.5px 0px; + vertical-align: middle; + width: 20px; + height: 20px; +} + + +/* Brand Styles +–––––––––––––––––––––––––––––––––––––––––––––––––– */ + +/* Default (this is great for your own brand color!) */ +.button.button-default { + color: #FFFFFF; + background-color: #0085FF } +.button.button-default:hover, +.button.button-default:focus { + filter: brightness(90%) } + +/* Discord */ +.button.button-discord { + color: #FFFFFF; + background-color: #5865F2 } +.button.button-discord:hover, +.button.button-discord:focus { + filter: brightness(90%) } + +/* Facebook */ +.button.button-facebook { + color: #FFFFFF; + background-color: #1877f2 } +.button.button-facebook:hover, +.button.button-facebook:focus { + filter: brightness(90%) } + +/* Facebook Messenger */ +.button.button-messenger { + color: #FFFFFF; + background-image: linear-gradient(25deg,#0099FF, #5F5DFF,#A033FF, #C740CC, #FF5280, #FF7061) } +.button.button-messenger:hover, +.button.button-messenger:focus { + filter: brightness(90%) } + +/* Figma */ +.button.button-figma { + color: #FFFFFF; + background-color: #000000 } +.button.button-figma:hover, +.button.button-figma:focus { + filter: brightness(90%) } + +/* Github */ +.button.button-github { + color: #FFFFFF; + background-color: #000000 } +.button.button-github:hover, +.button.button-github:focus { + filter: brightness(90%) } + +/* Goodreads */ +.button.button-goodreads { + color: #333333; + background-color: #F3F1E6 } +.button.button-goodreads:hover, +.button.button-goodreads:focus { + filter: brightness(90%) } + +/* Instagram */ +.button.button-instagram { + color: #FFFFFF; + background-image: linear-gradient(-135deg,#1400c8,#b900b4,#f50000) } +.button.button-instagram:hover, +.button.button-instagram:focus { + filter: brightness(90%) } + +/* Kit */ +.button.button-kit { + color: #FFFFFF; + background-color: #000000 } +.button.button-kit:hover, +.button.button-kit:focus { + filter: brightness(90%) } + +/* LinkedIn */ +.button.button-linkedin { + color: #FFFFFF; + background-color: #2867B2 } +.button.button-linkedin:hover, +.button.button-linkedin:focus { + filter: brightness(90%) } + +/* Medium */ +.button.button-medium { + color: #FFFFFF; + background-color: #000000 } +.button.button-medium:hover, +.button.button-medium:focus { + filter: brightness(90%) } + +/* Pinterest */ +.button.button-pinterest { + color: #000000; + background-color: #FFE2EB } +.button.button-pinterest:hover, +.button.button-pinterest:focus { + filter: brightness(90%) } + +/* Producthunt */ +.button.button-producthunt { + color: #DA552F; + border-style: solid; + border-color: #DA552F; + border-width: 2px; + background-color: #FFFFFF } +.button.button-producthunt:hover, +.button.button-producthunt:focus { + filter: brightness(90%) } + +/* Reddit */ +.button.button-reddit { + color: #000000; + background-color: #D7DFE2 } +.button.button-reddit:hover, +.button.button-reddit:focus { + filter: brightness(90%) } + +/* Skoob */ +.button.button-skoob { + color: #FFFFFF; + background-color: #3189C8 } +.button.button-skoob:hover, +.button.button-skoob:focus { + filter: brightness(90%) } + +/* Snapchat */ +.button.button-snapchat { + color: #000000; + background-color: #fffc00 } +.button.button-snapchat:hover, +.button.button-snapchat:focus { + filter: brightness(90%) } + +/* SoundCloud */ +.button.button-soundcloud { + color: #FFFFFF; + background-color: #ff5500 } +.button.button-soundcloud:hover, +.button.button-soundcloud:focus { + filter: brightness(90%) } + +/* Spotify */ +.button.button-spotify { + color: #FFFFFF; + background-color: #000000 } +.button.button-spotify:hover, +.button.button-spotify:focus { + filter: brightness(90%) } + +/* Steam */ +.button.button-steam { + color: #FFFFFF; + background-color: #171a21 } +.button.button-steam:hover, +.button.button-steam:focus { + filter: brightness(90%) } + +/* Telegram */ +.button.button-telegram { + color: #FFFFFF; + background-color: #3faee8 } +.button.button-telegram:hover, +.button.button-telegram:focus { + filter: brightness(90%) } + +/* TikTok */ +.button.button-tiktok { + color: #FFFFFF; + background-color: #000000 } +.button.button-tiktok:hover, +.button.button-tiktok:focus { + filter: brightness(90%) } + +/* Tumblr */ +.button.button-tumblr { + color: #FFFFFF; + background-color: #131313 } +.button.button-tumblr:hover, +.button.button-tumblr:focus { + filter: brightness(90%) } + +/* Twitch */ +.button.button-twitch { + color: #FFFFFF; + background-color: #9146ff } +.button.button-twitch:hover, +.button.button-twitch:focus { + filter: brightness(90%) } + +/* Twitter */ +.button.button-twitter { + color: #FFFFFF; + background-color: #1DA1F2 } +.button.button-twitter:hover, +.button.button-twitter:focus { + filter: brightness(90%) } + +/* Vimeo */ +.button.button-vimeo { + color: #FFFFFF; + background-color: #1ab7ea } +.button.button-vimeo:hover, +.button.button-vimeo:focus { + filter: brightness(90%) } + +/* YouTube */ +.button.button-youtube { + color: #FFFFFF; + background-color: #000000 } +.button.button-youtube:hover, +.button.button-youtube:focus { + filter: brightness(90%) } + +/* Wordpress */ +.button.button-wordpress { + color: #FFFFFF; + background-color: #21759b } +.button.button-wordpress:hover, +.button.button-wordpress:focus { + filter: brightness(90%) } diff --git a/www/css/normalize.css b/www/css/normalize.css new file mode 100644 index 0000000..81c6f31 --- /dev/null +++ b/www/css/normalize.css @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} \ No newline at end of file diff --git a/www/css/skeleton-dark.css b/www/css/skeleton-dark.css new file mode 100644 index 0000000..8b65b6e --- /dev/null +++ b/www/css/skeleton-dark.css @@ -0,0 +1,177 @@ +/* +* littlelink V1 +* https://littlelink.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/21/2019 +* +* Built using: +* +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + + +/* Table of contents +–––––––––––––––––––––––––––––––––––––––––––––––––– +- Grid +- Base Styles +- Typography +- Links +- Code +- Spacing +- Utilities +* +* You'll find the button css in css/brands.css. +* +*/ + + +/* Grid +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.container { + position: relative; + width: 100%; + max-width: 600px; + text-align: center; + margin: 0 auto; + padding: 0 20px; + box-sizing: border-box; } +.column { + position: center; + width: 100%; + float: center; + box-sizing: border-box; } + +/* For devices larger than 400px */ +@media (min-width: 400px) { + .container { + width: 85%; + padding: 0; } +} + +/* For devices larger than 550px */ +@media (min-width: 550px) { + .container { + width: 80%; } + .column, + .columns { + margin-left: 0; } + .column:first-child, + .columns:first-child { + margin-left: 0; } + +} + + +/* Base Styles +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* NOTE +html is set to 62.5% so that all the REM measurements throughout Skeleton +are based on 10px sizing. So basically 1.5rem = 15px :) */ + +html { + font-size: 100%; } +body { + background-color: #292929; + font-size: 18px; + line-height: 24px; + font-weight: 400; + font-family: "Open Sans", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #FFFFFF; } + + +/* Typography +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +h1 { + margin-top: 0; + margin-bottom: 16px; + font-weight: 800; } +h1 { font-size:24px; line-height: 64px; letter-spacing: 0;} + + +/* Larger than phablet */ +@media (min-width: 550px) { + h1 { font-size: 48px; line-height: 96px;} +} + +p { + margin-top: 0; } + + +/* Links +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +a { + color: #0085FF; } +a:hover { + color: #0085FF; } + + +/* Code +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +code { + padding: .2rem .5rem; + margin: 0 .2rem; + font-size: 90%; + color: #000000; + white-space: nowrap; + background: #F1F1F1; + border: 1px solid #E1E1E1; + border-radius: 4px; } +pre > code { + display: block; + padding: 1rem 1.5rem; + white-space: pre; } + +/* Spacing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +button, +.button { + margin-bottom: 1rem; } +input, +textarea, +select, +fieldset { + margin-bottom: 1.5rem; } +pre, +blockquote, +dl, +figure, +p, +ol { + margin-bottom: 2.5rem; } + + +/* Utilities +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.u-full-width { + width: 100%; + box-sizing: border-box; } +.u-max-full-width { + max-width: 100%; + box-sizing: border-box; } +.u-pull-right { + float: right; } +.u-pull-left { + float: left; } + + +/* Misc +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +hr { + margin-top: 3rem; + margin-bottom: 3.5rem; + border-width: 0; + border-top: 1px solid #E1E1E1; } + + +.avatar { + vertical-align: middle; + width: 96px; + height: 96px; + border-radius: 50%; +} \ No newline at end of file diff --git a/www/css/skeleton-light.css b/www/css/skeleton-light.css new file mode 100644 index 0000000..478b731 --- /dev/null +++ b/www/css/skeleton-light.css @@ -0,0 +1,167 @@ +/* +* littlelink V1 +* https://littlelink.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/21/2019 +* +* Built using: +* +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + + +/* Table of contents +–––––––––––––––––––––––––––––––––––––––––––––––––– +- Grid +- Base Styles +- Typography +- Links +- Code +- Spacing +- Utilities +* +* You'll find the button css in css/brands.css. +* +*/ + + +/* Grid +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.container { + position: relative; + width: 100%; + max-width: 600px; + text-align: center; + margin: 0 auto; + padding: 0 20px; + box-sizing: border-box; } +.column { + position: center; + width: 100%; + float: center; + box-sizing: border-box; } + +/* For devices larger than 400px */ +@media (min-width: 400px) { + .container { + width: 85%; + padding: 0; } +} + +/* For devices larger than 550px */ +@media (min-width: 550px) { + .container { + width: 80%; } + .column, + .columns { + margin-left: 0; } + .column:first-child, + .columns:first-child { + margin-left: 0; } + +} + + +/* Base Styles +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* NOTE +html is set to 62.5% so that all the REM measurements throughout Skeleton +are based on 10px sizing. So basically 1.5rem = 15px :) */ +html { + font-size: 100%; } +body { + font-size: 18px; + line-height: 24px; + font-weight: 400; + font-family: "Open Sans", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #222; } + + +/* Typography +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +h1 { + margin-top: 0; + margin-bottom: 16px; + font-weight: 800; } +h1 { font-size:24px; line-height: 64px; letter-spacing: 0;} + + +/* Larger than phablet */ +@media (min-width: 550px) { + h1 { font-size: 48px; line-height: 96px;} +} + +p { + margin-top: 0; } + + +/* Links +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +a { + color: #0085FF; } +a:hover { + color: #0085FF; } + + +/* Code +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +code { + padding: .2rem .5rem; + margin: 0 .2rem; + font-size: 90%; + white-space: nowrap; + background: #F1F1F1; + border: 1px solid #E1E1E1; + border-radius: 4px; } +pre > code { + display: block; + padding: 1rem 1.5rem; + white-space: pre; } + +/* Spacing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +button, +.button { + margin-bottom: 1rem; } +input, +textarea, +select, +fieldset { + margin-bottom: 1.5rem; } +pre, +blockquote, +dl, +figure, +p, +ol { + margin-bottom: 2.5rem; } + + +/* Utilities +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.u-full-width { + width: 100%; + box-sizing: border-box; } +.u-max-full-width { + max-width: 100%; + box-sizing: border-box; } +.u-pull-right { + float: right; } +.u-pull-left { + float: left; } + + +/* Misc +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +hr { + margin-top: 3rem; + margin-bottom: 3.5rem; + border-width: 0; + border-top: 1px solid #E1E1E1; } + diff --git a/www/icons/discord.svg b/www/icons/discord.svg new file mode 100644 index 0000000..667def4 --- /dev/null +++ b/www/icons/discord.svg @@ -0,0 +1,3 @@ + + + diff --git a/www/icons/email.svg b/www/icons/email.svg new file mode 100644 index 0000000..85697ac --- /dev/null +++ b/www/icons/email.svg @@ -0,0 +1,3 @@ + + + diff --git a/www/icons/email_alt.svg b/www/icons/email_alt.svg new file mode 100644 index 0000000..954a4af --- /dev/null +++ b/www/icons/email_alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/www/icons/facebook.svg b/www/icons/facebook.svg new file mode 100644 index 0000000..62b14e2 --- /dev/null +++ b/www/icons/facebook.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/www/icons/figma.svg b/www/icons/figma.svg new file mode 100644 index 0000000..9cb862d --- /dev/null +++ b/www/icons/figma.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/www/icons/github.svg b/www/icons/github.svg new file mode 100644 index 0000000..543256c --- /dev/null +++ b/www/icons/github.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/www/icons/goodreads.svg b/www/icons/goodreads.svg new file mode 100644 index 0000000..ce87093 --- /dev/null +++ b/www/icons/goodreads.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/icons/instagram.svg b/www/icons/instagram.svg new file mode 100644 index 0000000..a398760 --- /dev/null +++ b/www/icons/instagram.svg @@ -0,0 +1,3 @@ + + + diff --git a/www/icons/kit.svg b/www/icons/kit.svg new file mode 100644 index 0000000..5c27073 --- /dev/null +++ b/www/icons/kit.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/www/icons/linkedin.svg b/www/icons/linkedin.svg new file mode 100644 index 0000000..d8c921a --- /dev/null +++ b/www/icons/linkedin.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/www/icons/medium.svg b/www/icons/medium.svg new file mode 100644 index 0000000..ac7d0fd --- /dev/null +++ b/www/icons/medium.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/www/icons/messenger.svg b/www/icons/messenger.svg new file mode 100644 index 0000000..87a9e0a --- /dev/null +++ b/www/icons/messenger.svg @@ -0,0 +1,3 @@ + + + diff --git a/www/icons/pinterest.svg b/www/icons/pinterest.svg new file mode 100644 index 0000000..c57d0f6 --- /dev/null +++ b/www/icons/pinterest.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/www/icons/producthunt.svg b/www/icons/producthunt.svg new file mode 100644 index 0000000..f1df0f5 --- /dev/null +++ b/www/icons/producthunt.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/www/icons/reddit.svg b/www/icons/reddit.svg new file mode 100644 index 0000000..ec269db --- /dev/null +++ b/www/icons/reddit.svg @@ -0,0 +1,4 @@ + + + + diff --git a/www/icons/skoob.svg b/www/icons/skoob.svg new file mode 100644 index 0000000..d24b768 --- /dev/null +++ b/www/icons/skoob.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/icons/snapchat.svg b/www/icons/snapchat.svg new file mode 100644 index 0000000..55e4b3e --- /dev/null +++ b/www/icons/snapchat.svg @@ -0,0 +1,4 @@ + + + + diff --git a/www/icons/soundcloud.svg b/www/icons/soundcloud.svg new file mode 100644 index 0000000..1f428ad --- /dev/null +++ b/www/icons/soundcloud.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/www/icons/spotify.svg b/www/icons/spotify.svg new file mode 100644 index 0000000..97f8106 --- /dev/null +++ b/www/icons/spotify.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/www/icons/steam.svg b/www/icons/steam.svg new file mode 100644 index 0000000..96af0d4 --- /dev/null +++ b/www/icons/steam.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/www/icons/telegram.svg b/www/icons/telegram.svg new file mode 100644 index 0000000..9d471fc --- /dev/null +++ b/www/icons/telegram.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/www/icons/tiktok.svg b/www/icons/tiktok.svg new file mode 100644 index 0000000..ecf0715 --- /dev/null +++ b/www/icons/tiktok.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/www/icons/tumblr.svg b/www/icons/tumblr.svg new file mode 100644 index 0000000..de775cf --- /dev/null +++ b/www/icons/tumblr.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/www/icons/twitch.svg b/www/icons/twitch.svg new file mode 100644 index 0000000..f0d29b0 --- /dev/null +++ b/www/icons/twitch.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/www/icons/twitter.svg b/www/icons/twitter.svg new file mode 100644 index 0000000..856eedf --- /dev/null +++ b/www/icons/twitter.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/www/icons/vimeo.svg b/www/icons/vimeo.svg new file mode 100644 index 0000000..b04df9b --- /dev/null +++ b/www/icons/vimeo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/www/icons/wordpress.svg b/www/icons/wordpress.svg new file mode 100644 index 0000000..f8ce5ed --- /dev/null +++ b/www/icons/wordpress.svg @@ -0,0 +1,3 @@ + + + diff --git a/www/icons/youtube.svg b/www/icons/youtube.svg new file mode 100644 index 0000000..7cf1b9b --- /dev/null +++ b/www/icons/youtube.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/www/images/avatar.png b/www/images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..694dfc1bae6814640b7d9e9d52a7a3eb41f84226 GIT binary patch literal 1742 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 DkLXSN literal 0 HcmV?d00001 diff --git a/www/index.html b/www/index.html new file mode 100644 index 0000000..2d6fe39 --- /dev/null +++ b/www/index.html @@ -0,0 +1,216 @@ + + + + + + LittleLink + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + LittleLink Logo + + +

LittleLink

+ + +

LittleLink is an open source DIY alternative to services like Linktree and many.link. LittleLink was built using Skeleton, a dead simple, responsive boilerplateβ€”we’ve just created some branded buttons and stripped out the things you won't need. 😊

+ + + + + + GitHub LogoGitHub +
+ + + Twitter LogoTwitter +
+ + + Instagram LogoInstagram +
+ + + Facebook LogoFind us on Facebook +
+ + + Facebook Messenger LogoChat on Messenger +
+ + + LinkedIn LogoLinkedIn +
+ + + YouTube LogoYouTube +
+ + + Discord LogoDiscord +
+ + + Twitch LogoTwitch +
+ + + Product Hunt LogoProduct Hunt +
+ + + Snapchat LogoSnapchat +
+ + + Spotify LogoSpotify +
+ + + Reddit LogoReddit +
+ + + Medium LogoMedium +
+ + + Pinterest LogoFollow on Pinterest +
+ + + TikTok LogoTikTok +
+ + + Email Iconhello@littlelink.io +
+ + + Email Iconhello@littlelink.io +
+ + + SoundCloud LogoSoundCloud +
+ + + Figma LogoFigma +
+ + + Kit LogoKit +
+ + + Telegram LogoTelegram +
+ + + Tumblr LogoTumblr +
+ + + Steam LogoSteam +
+ + + Vimeo LogoVimeo +
+ + + Wordpress LogoWordpress +
+ + + Goodreads LogoGoodreads +
+ + + Skoob LogoSkoob +
+ +
+
+ + +
+
+
+ + + + + diff --git a/www/js/env.js b/www/js/env.js new file mode 100644 index 0000000..b5bca6d --- /dev/null +++ b/www/js/env.js @@ -0,0 +1,341 @@ +var env = { + META_TITLE: '$META_TITLE', + META_DESCRIPTION: '$META_DESCRIPTION', + META_AUTHOR: '$META_AUTHOR', + THEME: '$THEME', + FAVICON_URL: '$FAVICON_URL', + AVATAR_URL: '$AVATAR_URL', + AVATAR_ALT: '$AVATAR_ALT', + NAME:'$NAME', + BIO: '$BIO', + GITHUB: '$GITHUB', + TWITTER: '$TWITTER', + INSTAGRAM: '$INSTAGRAM', + FACEBOOK: '$FACEBOOK', + FACEBOOK_MESSENGER: '$FACEBOOK_MESSENGER', + LINKED_IN: '$LINKED_IN', + YOUTUBE: '$YOUTUBE', + DISCORD: '$DISCORD', + TWITCH: '$TWITCH', + PRODUCT_HUNT: '$PRODUCT_HUNT', + SNAPCHAT: '$SNAPCHAT', + SPOTIFY: '$SPOTIFY', + REDDIT: '$REDDIT', + MEDIUM: '$MEDIUM', + PINTEREST: '$PINTEREST', + TIKTOK: '$TIKTOK', + EMAIL: '$EMAIL', + EMAIL_ALT: '$EMAIL_ALT', + SOUND_CLOUD: '$SOUND_CLOUD', + FIGMA: '$FIGMA', + KIT: '$KIT', + TELEGRAM: '$TELEGRAM', + TUMBLR: '$TUMBLR', + STEAM: '$STEAM', + VIMEO: '$VIMEO', + WORDPRESS: '$WORDPRESS', + GOODREADS: '$GOODREADS', + SKOOB: '$SKOOB', + FOOTER: '$FOOTER', + +} + +var metalTitleEl = document.getElementById('meta-title'); +if (env.META_TITLE) { + metalTitleEl.innerText = env.META_TITLE; +} else { + metalTitleEl.remove() +} + +var metalDescriptionEl = document.getElementById('meta-description'); +if (env.META_DESCRIPTION) { + metalDescriptionEl.content = env.META_DESCRIPTION; +} else { + metalDescriptionEl.remove() +} + +var metaAuthorEl = document.getElementById('meta-author'); +if (env.META_AUTHOR) { + metaAuthorEl.content = env.META_AUTHOR; +} else { + metaAuthorEl.remove() +} + +var themeEl = document.getElementById('theme'); +if (env.THEME && env.THEME.toLocaleLowerCase() === 'dark') { + themeEl.href = 'css/skeleton-dark.css'; +} else { + themeEl.href = 'css/skeleton-light.css'; +} + +var faviconEl = document.getElementById('favicon'); +if (env.FAVICON_URL) { + faviconEl.href = env.FAVICON_URL; +} + +var avatarEl = document.getElementById('avatar'); +if (env.AVATAR_URL) { + avatarEl.src = env.AVATAR_URL; + avatarEl.alt = env.AVATAR_ALT; +} else { + avatarEl.remove() +} + +var nameEl = document.getElementById('name'); +if (env.NAME) { + nameEl.innerText = env.NAME; +} else { + nameEl.remove() +} + +var bioEl = document.getElementById('bio'); +if (env.BIO) { + bioEl.innerText = env.BIO; +} else { + bioEl.remove() +} + +var githubEl = document.getElementById('github'); +if (env.GITHUB) { + githubEl.href = env.GITHUB; +} else { + githubEl.nextElementSibling.remove() + githubEl.remove() +} + +var twitterEl = document.getElementById('twitter'); +if (env.TWITTER) { + twitterEl.href = env.TWITTER; +} else { + twitterEl.nextElementSibling.remove() + twitterEl.remove() +} + +var instagramEl = document.getElementById('instagram'); +if (env.INSTAGRAM) { + instagramEl.href = env.INSTAGRAM; +} else { + instagramEl.nextElementSibling.remove() + instagramEl.remove() +} + +var facebookEl = document.getElementById('facebook'); +if (env.FACEBOOK) { + facebookEl.href = env.FACEBOOK; +} else { + facebookEl.nextElementSibling.remove() + facebookEl.remove() +} + +var facebookMessengerEl = document.getElementById('facebook-messenger'); +if (env.FACEBOOK_MESSENGER) { + facebookMessengerEl.href = env.FACEBOOK_MESSENGER; +} else { + facebookMessengerEl.nextElementSibling.remove() + facebookMessengerEl.remove() +} + + +var linkedInEl = document.getElementById('linkedin'); +if (env.LINKED_IN) { + linkedInEl.href = env.LINKED_IN; +} else { + linkedInEl.nextElementSibling.remove() + linkedInEl.remove() +} + + +var youTubeEl = document.getElementById('youtube'); +if (env.YOUTUBE) { + youTubeEl.href = env.YOUTUBE; +} else { + youTubeEl.nextElementSibling.remove() + youTubeEl.remove() +} + + +var discordEl = document.getElementById('discord'); +if (env.DISCORD) { + discordEl.href = env.DISCORD; +} else { + discordEl.nextElementSibling.remove() + discordEl.remove() +} + + +var twitchEl = document.getElementById('twitch'); +if (env.TWITCH) { + twitchEl.href = env.TWITCH; +} else { + twitchEl.nextElementSibling.remove() + twitchEl.remove() +} + +var productHunEl = document.getElementById('producthunt'); +if (env.PRODUCT_HUNT) { + productHunEl.href = env.PRODUCT_HUNT; +} else { + productHunEl.nextElementSibling.remove() + productHunEl.remove() +} + +var snapchatEl = document.getElementById('snapchat'); +if (env.SNAPCHAT) { + snapchatEl.href = env.SNAPCHAT; +} else { + snapchatEl.nextElementSibling.remove() + snapchatEl.remove() +} + +var spotifyEl = document.getElementById('spotify'); +if (env.SPOTIFY) { + spotifyEl.href = env.SPOTIFY; +} else { + spotifyEl.nextElementSibling.remove() + spotifyEl.remove() +} + +var redditEl = document.getElementById('reddit'); +if (env.REDDIT) { + redditEl.href = env.REDDIT; +} else { + redditEl.nextElementSibling.remove() + redditEl.remove() +} + + +var mediumEl = document.getElementById('medium'); +if (env.MEDIUM) { + mediumEl.href = env.MEDIUM; +} else { + mediumEl.nextElementSibling.remove() + mediumEl.remove() +} + + +var pinterestEl = document.getElementById('pinterest'); +if (env.PINTEREST) { + pinterestEl.href = env.PINTEREST; +} else { + pinterestEl.nextElementSibling.remove() + pinterestEl.remove() +} + +var tiktokEl = document.getElementById('tiktok'); +if (env.TIKTOK) { + tiktokEl.href = env.TIKTOK; +} else { + tiktokEl.nextElementSibling.remove() + tiktokEl.remove() +} + +var emailEl = document.getElementById('email'); +if (env.EMAIL) { + emailEl.href = env.EMAIL; +} else { + emailEl.nextElementSibling.remove() + emailEl.remove() +} + + +var emailAltEl = document.getElementById('email-alt'); +if (env.EMAIL_ALT) { + emailAltEl.href = env.EMAIL_ALT; +} else { + emailAltEl.nextElementSibling.remove() + emailAltEl.remove() +} + +var soundCloudEl = document.getElementById('soundcloud'); +if (env.SOUND_CLOUD) { + soundCloudEl.href = env.SOUND_CLOUD; +} else { + soundCloudEl.nextElementSibling.remove() + soundCloudEl.remove() +} + + +var figmaEl = document.getElementById('figma'); +if (env.FIGMA) { + figmaEl.href = env.FIGMA; +} else { + figmaEl.nextElementSibling.remove() + figmaEl.remove() +} + + +var kitEl = document.getElementById('kit'); +if (env.KIT) { + kitEl.href = env.KIT; +} else { + kitEl.nextElementSibling.remove() + kitEl.remove() +} + + +var telegramEl = document.getElementById('telegram'); +if (env.TELEGRAM) { + telegramEl.href = env.TELEGRAM; +} else { + telegramEl.nextElementSibling.remove() + telegramEl.remove() +} + +var temblrEl = document.getElementById('tumblr'); +if (env.TUMBLR) { + temblrEl.href = env.TUMBLR; +} else { + temblrEl.nextElementSibling.remove() + temblrEl.remove() +} + + +var steamEl = document.getElementById('steam'); +if (env.STEAM) { + steamEl.href = env.STEAM; +} else { + steamEl.nextElementSibling.remove() + steamEl.remove() +} + + +var vimeoEl = document.getElementById('vimeo'); +if (env.VIMEO) { + vimeoEl.href = env.VIMEO; +} else { + vimeoEl.nextElementSibling.remove() + vimeoEl.remove() +} + + +var wordpressEl = document.getElementById('wordpress'); +if (env.WORDPRESS) { + wordpressEl.href = env.WORDPRESS; +} else { + wordpressEl.nextElementSibling.remove() + wordpressEl.remove() +} + +var goodreadsEl = document.getElementById('goodreads'); +if (env.GOODREADS) { + goodreadsEl.href = env.GOODREADS; +} else { + goodreadsEl.nextElementSibling.remove() + goodreadsEl.remove() +} + +var skoobEl = document.getElementById('skoob'); +if (env.SKOOB) { + skoobEl.href = env.SKOOB; +} else { + skoobEl.nextElementSibling.remove() + skoobEl.remove() +} + + +var footerEl = document.getElementById('footer'); +if (env.FOOTER) { + footerEl.innerText = env.FOOTER; +} else { + footerEl.remove() +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..699f0b7 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,431 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +helmet@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-4.6.0.tgz#579971196ba93c5978eb019e4e8ec0e50076b4df" + integrity sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +mime-db@1.49.0, "mime-db@>= 1.43.0 < 2": + version "1.49.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== + +mime-types@~2.1.24: + version "2.1.32" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + dependencies: + mime-db "1.49.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=