├── .eslintrc
├── .gitignore
├── .sequelizerc
├── LICENSE
├── Procfile
├── README.md
├── app.json
├── app
├── controllers
│ ├── auth.js
│ ├── home.js
│ ├── index.js
│ └── tutorial.js
├── index.js
├── models
│ ├── index.js
│ ├── migrations
│ │ └── 20190228221840-create-user.js
│ └── user.js
├── routes.js
├── services
│ └── github.js
├── static
│ ├── css
│ │ ├── colors.css
│ │ └── style.css
│ ├── favicon.ico
│ └── img
│ │ └── logo.png
└── templates
│ ├── 401.html
│ ├── 404.html
│ ├── 500.html
│ ├── home
│ └── index.html
│ ├── layouts
│ └── layout.html
│ ├── partials
│ ├── footer.html
│ ├── header.html
│ └── repo.html
│ └── tutorial
│ └── index.html
├── config
├── databases.json
├── index.js
└── paths.js
├── docs
├── CONDUCT.md
├── CONTRIBUTING.md
└── USER_GUIDE.md
├── package-lock.json
└── package.json
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "max-len": [1, 120, 2]
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 |
12 | # local scripts
13 | /local
14 |
15 | # misc
16 | .DS_Store
17 | .env
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
--------------------------------------------------------------------------------
/.sequelizerc:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | module.exports = {
4 | "config": path.resolve('./config', 'databases.json'),
5 | "models-path": path.resolve('./app/models'),
6 | "migrations-path": path.resolve('./app/models/migrations'),
7 | };
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2019 Major League Hacking, Inc.
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in all
11 | copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | SOFTWARE
20 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: npm run deploy
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Introduction
2 |
3 | This is a hackathon boilerplate for new Node.js applications created by [Major League Hacking](https://github.com/mlh). It is for hackers looking to get started quickly on a new hackathon project using the Node.js environment.
4 |
5 | - [Installation Guide](#installation-guide) - How to get started with a new Node.js app
6 | - [User Guide](https://github.com/MLH/mlh-hackathon-nodejs-starter/blob/master/docs/USER_GUIDE.md) - How to develop apps created with this starter project
7 | - [Contributing Guide](https://github.com/MLH/mlh-hackathon-nodejs-starter/blob/master/docs/CONTRIBUTING.md) - How to contribute to the project
8 |
9 | # Installation Guide
10 |
11 | This project requires the following tools:
12 |
13 | - [Node.js](https://nodejs.org/en/) - The JavaScript environment for server-side code.
14 | - [NPM](https://www.npmjs.com/) - A Node.js package manager used to install dependencies.
15 | - [PostgreSQL](https://www.postgresql.org/) - A relational database system.
16 |
17 | To get started, install NPM and Postgres on your local computer if you don't have them already. A simple way for Mac OS X users to install Postgres is using [Postgres.app](https://postgresapp.com/). Here is a [Windows guide](https://www.postgresqltutorial.com/install-postgresql/) for installing PostgresSQL.
18 |
19 | ## Getting Started
20 |
21 | **Step 1. Clone the code into a fresh folder**
22 |
23 | ```
24 | $ git clone https://github.com/MLH/mlh-hackathon-nodejs-starter.git
25 | $ cd mlh-hackathon-nodejs-starter
26 | ```
27 |
28 | **Step 2. Install Dependencies.**
29 |
30 | Next, we need to install the project dependencies, which are listed in `package.json`.
31 |
32 | ```
33 | $ npm install
34 | ```
35 |
36 | **Step 3: Create an app on GitHub**
37 |
38 | Head over to [GitHub OAuth apps](https://github.com/settings/developers) and create a new OAuth app. Name it what you like but you'll need to specify a callback URL, which should be something like:
39 |
40 | ```
41 | https://localhost:5000/auth/callback/github
42 | ```
43 |
44 | The default port for our app is `5000`, but you may need to update this if your setup uses a different port or if you're hosting your app somewhere besides your local machine.
45 |
46 | **Step 4: Update environment variables and run the Server.**
47 |
48 | Create a new file named `.env` by duplicating `.env.sample`. Update the new file with the GitHub credentials. It should look similar to this:
49 |
50 | ```
51 | # .env file
52 | DATABASE_URL="[INSERT_DATABASE_URL]"
53 | GITHUB_CLIENT_ID="[INSERT_CLIENT_ID]"
54 | GITHUB_CLIENT_SECRET="[INSERT_CLIENT_SECRET]"
55 | ```
56 |
57 | You replace the GitHub credentials here and update the database URL. Learn more about the required [Environment Variables here](#environment-variables).
58 |
59 | Now we're ready to start our server which is as simple as:
60 |
61 | ```
62 | $ npm start
63 | ```
64 |
65 | Open http://localhost:5000 to view it in your browser.
66 |
67 | The app will automatically reload if you make changes to the code.
68 | You will see the build errors and warnings in the console.
69 |
70 | # What's Included?
71 |
72 | - [Express](https://expressjs.com/) - A minimal web framework for Node.js web applications
73 | - [Sequelize](http://docs.sequelizejs.com/) - A promise-based ORM for Node.js that supports PostgreSQL, MySQL, and SQLite.
74 | - [Bootstrap 4](https://getbootstrap.com/) - An open source design system for HTML, CSS, and JS.
75 | - [Handlebars](https://handlebarsjs.com/) - A popular templating language for building layouts.
76 |
77 | # Code of Conduct
78 |
79 | We enforce a Code of Conduct for all maintainers and contributors of this Guide. Read more in [CONDUCT.md][mlh-conduct].
80 |
81 | # License
82 |
83 | The Hackathon Starter Kit is open source software [licensed as MIT][mlh-license].
84 |
85 | [mlh-conduct]: https://github.com/MLH/mlh-hackathon-nodejs-starter/blob/master/docs/CONDUCT.md
86 | [mlh-license]: https://github.com/MLH/mlh-hackathon-nodejs-starter/blob/master/LICENSE.md
87 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MLH Hackathon Node.js Starter",
3 | "description": "A hackathon starting point for new Node.js applications",
4 | "repository": "https://github.com/MLH/mlh-hackathon-nodejs-starter.git",
5 | "logo": "https://avatars1.githubusercontent.com/u/5752708?s=100",
6 | "keywords": ["nodejs", "javascript"]
7 | }
8 |
--------------------------------------------------------------------------------
/app/controllers/auth.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const models = require("../models");
4 | const config = require("../../config");
5 | const GitHub = require("../services/github");
6 |
7 | const router = express.Router();
8 |
9 | router.get("/logout", function(req, res) {
10 | req.session.destroy();
11 | res.redirect("/");
12 | });
13 |
14 | router.get("/login/github", function(req, res) {
15 | const github = new GitHub({ client_id: config.githubClientId, client_secret: config.githubClientSecret });
16 | res.redirect(github.authorization_url("public_repo"));
17 | });
18 |
19 | router.get("/callback/github", async function(req, res) {
20 | if (!req.query.code) {
21 | return res.render("500");
22 | }
23 |
24 | // Fetch user from GitHub OAuth and store in session
25 | const github = new GitHub({ client_id: config.githubClientId, client_secret: config.githubClientSecret });
26 | const access_token = await github.get_token(req.query.code);
27 |
28 | if (!access_token) {
29 | return res.render("404");
30 | }
31 |
32 | const user = await models.User.find_or_create_from_token(access_token);
33 |
34 | req.session.access_token = access_token;
35 | req.session.user = user;
36 |
37 | return res.redirect("/");
38 | });
39 |
40 | module.exports = router;
41 |
--------------------------------------------------------------------------------
/app/controllers/home.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const router = express.Router();
4 |
5 | router.get("/", function(req, res) {
6 | res.render("home/index");
7 | });
8 |
9 | module.exports = router;
10 |
--------------------------------------------------------------------------------
/app/controllers/index.js:
--------------------------------------------------------------------------------
1 | const auth = require("./auth");
2 | const tutorial = require("./tutorial");
3 | const home = require("./home");
4 |
5 | module.exports = { auth, tutorial, home };
6 |
--------------------------------------------------------------------------------
/app/controllers/tutorial.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const GitHub = require("../services/github");
3 |
4 | const router = express.Router();
5 |
6 | router.get("/requesting", async function(req, res) {
7 | const { query = "" } = req.query;
8 |
9 | if (!req.session.access_token) {
10 | return res.render("tutorial/index");
11 | }
12 |
13 | const github = new GitHub({ access_token: req.session.access_token });
14 | const results1 = await github.get("/user/starred");
15 | let results2 = query.length > 0 ? await github.get("/search/repositories", { q: query }) : [];
16 | results2 = results2.items || [];
17 |
18 | return res.render("tutorial/index", {
19 | tutorial1: results1.slice(0, 5),
20 | tutorial2: results2.slice(0, 5),
21 | query: query
22 | });
23 | });
24 |
25 | module.exports = router;
26 |
--------------------------------------------------------------------------------
/app/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const session = require("express-session");
3 | const handlebars = require("express-handlebars");
4 | const compression = require("compression");
5 | const logger = require("morgan");
6 |
7 | const config = require("../config");
8 | const paths = require("../config/paths");
9 | const routes = require("./routes");
10 |
11 | // Set up the express app
12 | const app = express();
13 |
14 | // Log requests to the console.
15 | app.use(logger("dev"));
16 |
17 | // Will attempt to compress responses.
18 | app.use(compression());
19 |
20 | // Parse incoming requests data.
21 | app.use(express.json());
22 | app.use(express.urlencoded({ extended: true }));
23 |
24 | // Set up handlebars templating engine for layout files.
25 | app.engine("html", handlebars({ defaultLayout: "layout", extname: ".html" }));
26 | app.set("views", "app/templates");
27 | app.set("view engine", "html");
28 |
29 | // Set up session middleware
30 | const options = { secret: config.secretKey, saveUninitialized: true, resave: true };
31 | app.use(session(options));
32 | app.use(function(req, res, next) {
33 | res.locals.session = req.session;
34 | next();
35 | });
36 |
37 | // Set up the routes for the static assets.
38 | app.use(express.static(paths.staticEntry));
39 |
40 | routes.registerRoutes(app);
41 | routes.registerErrorHandlers(app);
42 |
43 | app.listen(config.port, () => {
44 | console.log(`🚀 Server started on port ${config.port}.`);
45 | });
46 |
--------------------------------------------------------------------------------
/app/models/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const fs = require("fs");
4 | const path = require("path");
5 | const Sequelize = require("sequelize");
6 | const basename = path.basename(__filename);
7 | const env = process.env.NODE_ENV || "development";
8 | const config = require("../../config/databases.json")[env];
9 | const db = {};
10 |
11 | let sequelize;
12 | if (config.use_env_variable) {
13 | sequelize = new Sequelize(process.env[config.use_env_variable], config);
14 | } else {
15 | sequelize = new Sequelize(config.database, config.username, config.password, config);
16 | }
17 |
18 | fs.readdirSync(__dirname)
19 | .filter(file => {
20 | return file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js";
21 | })
22 | .forEach(file => {
23 | const model = sequelize["import"](path.join(__dirname, file));
24 | db[model.name] = model;
25 | });
26 |
27 | Object.keys(db).forEach(modelName => {
28 | if (db[modelName].associate) {
29 | db[modelName].associate(db);
30 | }
31 | });
32 |
33 | db.sequelize = sequelize;
34 | db.Sequelize = Sequelize;
35 |
36 | module.exports = db;
37 |
--------------------------------------------------------------------------------
/app/models/migrations/20190228221840-create-user.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | module.exports = {
3 | up: (queryInterface, Sequelize) => {
4 | return queryInterface.createTable("Users", {
5 | id: {
6 | allowNull: false,
7 | autoIncrement: true,
8 | primaryKey: true,
9 | type: Sequelize.INTEGER
10 | },
11 | username: {
12 | type: Sequelize.STRING,
13 | allowNull: false,
14 | unique: true
15 | },
16 | avatar_url: {
17 | type: Sequelize.STRING
18 | },
19 | github_id: {
20 | type: Sequelize.STRING
21 | },
22 | createdAt: {
23 | allowNull: false,
24 | type: Sequelize.DATE
25 | },
26 | updatedAt: {
27 | allowNull: false,
28 | type: Sequelize.DATE
29 | }
30 | });
31 | },
32 | down: (queryInterface, Sequelize) => {
33 | return queryInterface.dropTable("Users");
34 | }
35 | };
36 |
--------------------------------------------------------------------------------
/app/models/user.js:
--------------------------------------------------------------------------------
1 | const GitHub = require("../services/github");
2 |
3 | module.exports = (sequelize, DataTypes) => {
4 | const User = sequelize.define(
5 | "User",
6 | {
7 | username: { type: DataTypes.STRING, unqiue: true, allowNull: false },
8 | avatar_url: DataTypes.STRING,
9 | github_id: DataTypes.STRING
10 | },
11 | { sequelize }
12 | );
13 |
14 | User.associate = function(models) {
15 | // associations can be defined here
16 | };
17 |
18 | User.find_or_create_from_token = async function(access_token) {
19 | const data = await GitHub.get_user_from_token(access_token);
20 |
21 | /* Find existing user or create new User instances */
22 | const [instance, created] = await this.findOrCreate({
23 | raw: true,
24 | where: { username: data["login"] },
25 | defaults: {
26 | username: data["login"],
27 | avatar_url: data["avatar_url"],
28 | github_id: data["id"]
29 | }
30 | });
31 |
32 | return instance;
33 | };
34 |
35 | return User;
36 | };
37 |
--------------------------------------------------------------------------------
/app/routes.js:
--------------------------------------------------------------------------------
1 | const controllers = require("./controllers");
2 | const config = require("../config");
3 |
4 | module.exports.registerRoutes = app => {
5 | app.use("/", controllers.home);
6 | app.use("/auth", controllers.auth);
7 | app.use("/tutorial", controllers.tutorial);
8 | };
9 |
10 | module.exports.registerErrorHandlers = app => {
11 | app.use(function(err, req, res, next) {
12 | console.error(err.message);
13 | res.status(err.status || 500);
14 | res.render("500", {
15 | message: err.message,
16 | error: config.env === "development" ? err : {}
17 | });
18 | });
19 | };
20 |
--------------------------------------------------------------------------------
/app/services/github.js:
--------------------------------------------------------------------------------
1 | const axios = require("axios");
2 |
3 | const api_url = "https://api.github.com";
4 | const authorize_url = "https://github.com/login/oauth/authorize";
5 | const token_url = "https://github.com/login/oauth/access_token";
6 |
7 | class GitHub {
8 | constructor({ client_id = "", client_secret = "", access_token = "" }) {
9 | this.client_id = client_id;
10 | this.client_secret = client_secret;
11 | this.access_token = access_token;
12 | }
13 |
14 | authorization_url(scope = "") {
15 | return `${authorize_url}?client_id=${this.client_id}&client_secret=${this.client_secret}&scope=${scope}`;
16 | }
17 |
18 | async get_token(code) {
19 | /* Fetch GitHub Access Token for GitHub OAuth */
20 | const config = { headers: { Accept: "application/json" } };
21 | const params = {
22 | code,
23 | client_id: this.client_id,
24 | client_secret: this.client_secret
25 | };
26 |
27 | const { data } = await axios.post(token_url, params, config);
28 | return data.access_token;
29 | }
30 |
31 | async get(route_url, params = {}) {
32 | const url = api_url + route_url;
33 | params["access_token"] = this.access_token;
34 |
35 | const response = await axios.get(url, { params });
36 | return response.data;
37 | }
38 |
39 | static async get_user_from_token(access_token) {
40 | /* Fetch user data using the access token. */
41 | const url = api_url + "/user";
42 | const config = { params: { access_token: access_token } };
43 |
44 | const response = await axios.get(url, config);
45 | return response.data;
46 | }
47 | }
48 |
49 | module.exports = GitHub;
50 |
--------------------------------------------------------------------------------
/app/static/css/colors.css:
--------------------------------------------------------------------------------
1 | /* colors.css - A stylesheet for custom color classes */
2 | /* Colors came from Primer CSS */
3 |
4 | /* Classes for changing background colors */
5 | .bg-white { background-color: #ffffff; }
6 | .bg-blue { background-color: #0366d6; }
7 | .bg-blue-light { background-color: #f1f8ff; }
8 | .bg-gray-dark { background-color: #24292e; }
9 | .bg-gray { background-color: #f6f8fa; }
10 | .bg-gray-light { background-color: #fafbfc; }
11 | .bg-green { background-color: #28a745; }
12 | .bg-green-light { background-color: #dcffe4; }
13 | .bg-red { background-color: #d73a49; }
14 | .bg-red-light { background-color: #ffdce0; }
15 | .bg-yellow { background-color: #ffd33d; }
16 | .bg-yellow-light { background-color: #fff5b1; }
17 | .bg-purple { background-color: #6f42c1; }
18 | .bg-purple-light { background-color: #f5f0ff; }
19 |
20 | /* Classes for changing text colors */
21 | .text-blue { color: #0366d6; }
22 | .text-red { color: #cb2431; }
23 | .text-gray-light { color: #6a737d; }
24 | .text-gray { color: #586069; }
25 | .text-gray-dark { color: #24292e; }
26 | .text-green { color: #28a745; }
27 | .text-orange { color: #a04100; }
28 | .text-orange-light { color: #e36209; }
29 | .text-purple { color: #6f42c1; }
30 | .text-white { color: #ffffff; }
31 | .text-inherit { color: inherit; }
32 |
33 | /* Classes for changing border colors */
34 | .border-blue { border-color: #0366d6 !important; }
35 | .border-blue-light { border-color: #c8e1ff !important; }
36 | .border-green { border-color: #34d058 !important; }
37 | .border-green-light { border-color: #a2cbac !important; }
38 | .border-red { border-color: #d73a49 !important; }
39 | .border-red-light { border-color: #cea0a5 !important; }
40 | .border-purple { border-color: #6f42c1 !important; }
41 | .border-yellow { border-color: #d9d0a5 !important; }
42 | .border-gray-light { border-color: #eaecef !important; }
43 | .border-gray-dark { border-color: #d1d5da !important; }
44 | .border-black-fade { border-color: rgba(27, 31, 35, 0.15); }
45 |
--------------------------------------------------------------------------------
/app/static/css/style.css:
--------------------------------------------------------------------------------
1 | /* Custom stylesheet */
2 |
3 | .nav-link:hover {
4 | color: inherit;
5 | text-decoration: none;
6 | opacity: .75;
7 | }
8 |
9 | .link-reset:hover {
10 | color: inherit;
11 | text-decoration: none;
12 | }
13 |
14 | .octicon {
15 | display: inline-block;
16 | vertical-align: text-top;
17 | }
18 |
--------------------------------------------------------------------------------
/app/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MLH/mlh-hackathon-nodejs-starter/d1931e340b4daeecd1ba3c19b740aef7c278c85a/app/static/favicon.ico
--------------------------------------------------------------------------------
/app/static/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MLH/mlh-hackathon-nodejs-starter/d1931e340b4daeecd1ba3c19b740aef7c278c85a/app/static/img/logo.png
--------------------------------------------------------------------------------
/app/templates/401.html:
--------------------------------------------------------------------------------
1 |
2 |
This isn't the page you are looking for.
3 |
We couldn't find this page. Please check your URL or go back home.
4 | Go back home
5 |
6 |
--------------------------------------------------------------------------------
/app/templates/404.html:
--------------------------------------------------------------------------------
1 |
2 |
This isn't the page you are looking for.
3 |
We couldn't find this page. Please check your URL or go back home.
4 | Go back home
5 |
6 |
--------------------------------------------------------------------------------
/app/templates/500.html:
--------------------------------------------------------------------------------
1 |
2 |
Oops, Something went wrong.
3 |
The server encountered an internal error or misconfiguration and was unable to complete your request.
4 |
Go back home
5 |
6 |
--------------------------------------------------------------------------------
/app/templates/home/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
Hackathon Node.js Starter
6 | Build your hackathon project faster.
7 |
8 |
Check the Docs
9 |
10 |
11 |
12 |
13 |
Edit controllers/
to update how to receive and reply to requests.
14 |
Edit templates/
to update the layout and styling.
15 |
Edit models/
to update how the data is stored.
16 |
17 |
--------------------------------------------------------------------------------
/app/templates/layouts/layout.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | My Hackathon Project
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | {{> header }}
14 | {{{ body }}}
15 | {{> footer }}
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/app/templates/partials/footer.html:
--------------------------------------------------------------------------------
1 | {{! Add a global footer here if you like }}
2 |
--------------------------------------------------------------------------------
/app/templates/partials/header.html:
--------------------------------------------------------------------------------
1 |
2 |
40 |
41 |
--------------------------------------------------------------------------------
/app/templates/partials/repo.html:
--------------------------------------------------------------------------------
1 |
14 |
--------------------------------------------------------------------------------
/app/templates/tutorial/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
Requesting Data
6 | Learn how to retrieve data from GitHub.
7 |
8 |
Check GitHub API
9 |
10 |
11 |
12 |
13 |
14 |
GitHub API
15 |
GitHub provides a way to request and interact with data on its platform. This makes it possible to use GitHub data in your application. For example, you can see all your favorite GitHub projects or show what code you are working. This interaction is done through a interface called an API. We provided examples of using GitHub's API to help you get started.
16 |
17 |
18 |
Retrieving your starred projects
19 |
You can retrieve your starred projects on GitHub using the /user/starred
endpoint. Within this starter project, you can also use the services/github.js
module, which makes it easier to make an authenticated request.
20 |
A GET request to the /user/starred
endpoint using the github.js
module would follow this format:
21 |
22 | const github = new GitHub({ access_token: access_token });
23 | const results = await github.get('/user/starred');
24 |
25 |
As a result, you will see your starred repositories below:
26 | {{#if tutorial1}}
27 | {{#each tutorial1 as |item|}}
28 | {{> repo item=item }}
29 | {{/each}}
30 | {{else}}
31 |
32 | {{#if session.user }}
33 |
You haven't starred any repositories on GitHub yet. You can star this project here .
34 | {{else}}
35 |
This example requires an authenticated user. Please log in to see your starred repositories.
36 | {{/if}}
37 |
38 | {{/if}}
39 |
40 |
41 |
42 |
Searching GitHub
43 |
The endpoint for searching GitHub projects is located at /search/repositories
. You can use this endpoint to find projects on GitHub. Within this starter project, you also can use the services/github.js
module, which makes it easier to make an authenticated request.
44 |
A GET request to the /search/repositories
endpoint using the github.js
module would follow this format:
45 |
46 | const github = new GitHub({ access_token: access_token });
47 | const results = await github.get('/search/repositories');
48 |
49 |
As a result, you should be able to search for GitHub projects below:
50 |
51 |
55 |
56 |
57 | {{#if tutorial2}}
58 | {{#each tutorial2 as |item|}}
59 | {{> repo item=item }}
60 | {{/each}}
61 | {{else}}
62 |
63 | {{#if session.user}}
64 | {{#if query}}
65 |
You can use the search bar above to find new projects.
66 | {{else}}
67 |
Cannot find a repository that matches that input. Please try again.
68 | {{/if}}
69 | {{else}}
70 |
Please sign in to use the search functionality.
71 | {{/if}}
72 |
73 | {{/if}}
74 |
75 |
76 |
--------------------------------------------------------------------------------
/config/databases.json:
--------------------------------------------------------------------------------
1 | {
2 | "development": {
3 | "database": "nodejs-starter-dev",
4 | "host": "127.0.0.1",
5 | "port": 5432,
6 | "dialect": "postgres"
7 | },
8 | "test": {
9 | "database": "nodejs-starter-test",
10 | "host": "127.0.0.1",
11 | "port": 5432,
12 | "dialect": "postgres"
13 | },
14 | "production": {
15 | "use_env_variable": "DATABASE_URL"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | const dotenv = require("dotenv");
2 |
3 | dotenv.config({ path: ".env" });
4 |
5 | module.exports = {
6 | port: process.env.PORT || 5000,
7 | env: process.env.NODE_ENV || "development",
8 | secretKey: process.env.SECRET_KEY || "octocat",
9 | githubClientId: process.env.GITHUB_CLIENT_ID || "",
10 | githubClientSecret: process.env.GITHUB_CLIENT_SECRET || ""
11 | };
12 |
--------------------------------------------------------------------------------
/config/paths.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 | const fs = require("fs");
3 |
4 | const appDirectory = fs.realpathSync(process.cwd());
5 | const resolveApp = relativePath => path.resolve(appDirectory, relativePath);
6 |
7 | module.exports = {
8 | staticEntry: resolveApp("app/static")
9 | };
10 |
--------------------------------------------------------------------------------
/docs/CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Code of Conduct
2 |
3 | All contributors and maintainers of this guide, in the interest of fostering an open and welcoming community, are required to adhere to the [Major League Hacking Code of Conduct][mlh-coc].
4 |
5 | ### Addendum for Open Source Projects
6 |
7 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to the [Major League Hacking Code of Conduct][mlh-coc], or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
8 |
9 | By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the [Code of Conduct][mlh-coc] may be permanently removed from the project team.
10 |
11 | The [Major League Hacking Code of Conduct][mlh-coc] applies both within project spaces and in public spaces when an individual is representing the project or its community.
12 |
13 | ### Credits
14 |
15 | Inspired by [Jekyll's Code of Conduct][jekyll-coc].
16 |
17 | [mlh-coc]: https://github.com/MLH/mlh-policies/blob/master/code-of-conduct.md
18 | [jekyll-coc]: https://github.com/jekyll/jekyll/blob/master/CONDUCT.markdown
19 |
--------------------------------------------------------------------------------
/docs/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Want to contribute to making this project better for others? Thanks! There are plenty of ways you can help.
4 |
5 | Before you do anything else, please read the [README][readme] of this project first. It will highlight the key features and help you understand the project structure. The rest of this document will help make the contribution process easier.
6 |
7 | ### Where do I go from here?
8 |
9 | If you noticed a bug or have a question, [open an issue][issues]. We'll try to answer it as fast as possible.
10 |
11 | ### Can you add this technology?
12 |
13 | This project includes many different frameworks and technologies to help hackers get started building an app quickly. If you would like to recommend or suggest a particular framework, [open an issue][issues]. Suggestions are always welcome.
14 |
15 | ### Can I submit a Pull Request?
16 |
17 | Pull requests to fix issues, add improvements, or other features are always appreciated! Good pull requests should be focused and avoid unrelated commits. Including helpful descriptions, titles, and screenshots will make it easier to review.
18 |
19 | Before working on changes, check if there is already an issue created in the [issue tracker][issues]. This will help reduce confusion on what can and should be changed. You can also reach out to [our email][email] if you want to work on an issue.
20 |
21 | ### What can I contribute to?
22 |
23 | Even the smallest change is appreciated. It can be a typo error or fixing a bug. Nothing is too small to be helpful. You can also reach out to [our email][email] if you want to work on an issue.
24 |
25 | [readme]: https://github.com/MLH/mlh-hackathon-nodejs-starter
26 | [issues]: https://github.com/MLH/mlh-hackathon-nodejs-starter/issues
27 | [email]: mailto:hi@mlh.io
28 |
--------------------------------------------------------------------------------
/docs/USER_GUIDE.md:
--------------------------------------------------------------------------------
1 | # User Guide
2 |
3 | This is the User Guide for the Hackathon Starter Kit. Here you will find additional documentation and guides on how to use the project.
4 |
5 | If you think we are missing something or you have ideas for more guides that should be on this page, [let us know][email] or [contribute some][mlh-contributing]!
6 |
7 | ## How It Works
8 |
9 | This project simply provides the boilerplate to get started with a new application. It provides the tools and guides to get started quickly. You can use this project as a starting point for building new applications during a hackathon.
10 |
11 | Even if you are not using it for a hackathon, it should save you time getting started building and learning web development.
12 |
13 | ## Starting the app
14 |
15 | **Step 1. Clone the code into a fresh folder**
16 |
17 | ```
18 | $ git clone https://github.com/MLH/mlh-hackathon-nodejs-starter.git
19 | $ cd mlh-hackathon-nodejs-starter
20 | ```
21 |
22 | **Step 2. Install Dependencies.**
23 |
24 | Next, we need to install the project dependencies, which are listed in `package.json`.
25 |
26 | ```
27 | $ npm install
28 | ```
29 |
30 | **Step 3: Create an app on GitHub**
31 |
32 | Head over to [GitHub OAuth apps](https://github.com/settings/developers) and create a new OAuth app. Name it what you like but you'll need to specify a callback URL, which should be something like:
33 |
34 | ```
35 | https://localhost:5000/auth/callback/github
36 | ```
37 |
38 | The default port for our app is `5000`, but you may need to update this if your setup uses a different port or if you're hosting your app somewhere besides your local machine.
39 |
40 | **Step 4: Update environment variables and run the Server.**
41 |
42 | Create a new file named `.env` by duplicating `.env.sample`. Update the new file with the GitHub credentials. It should look similar to this:
43 |
44 | ```
45 | # .env file
46 | DATABASE_URL="[INSERT_DATABASE_URL]"
47 | GITHUB_CLIENT_ID="[INSERT_CLIENT_ID]"
48 | GITHUB_CLIENT_SECRET="[INSERT_CLIENT_SECRET]"
49 | ```
50 |
51 | You replace the GitHub credentials here and update the database URL. Learn more about the required [Environment Variables here](#environment-variables).
52 |
53 | Now we're ready to start our server which is as simple as:
54 |
55 | ```
56 | $ npm start
57 | ```
58 |
59 | Open http://localhost:5000 to view it in your browser.
60 |
61 | The app will automatically reload if you make changes to the code.
62 | You will see the build errors and warnings in the console.
63 |
64 | ### `npm start`
65 |
66 | Runs the app in development mode.
67 | Open http://localhost:5000 to view it in your browser.
68 |
69 | The app will automatically reload if you make changes to the code.
70 | You will see the build errors and warnings in the console.
71 |
72 | ### `npm install`
73 |
74 | Installs the dependencies for your application. Used to add new functionality to the project.
75 |
76 | ## Project Structure
77 |
78 | ```
79 | mlh-hackathon-nodejs-starter/
80 | ├── README.md
81 | ├── Procfile
82 | ├── package.json
83 | ├── config/
84 | ├── docs/
85 | └── app/
86 | ├── controllers/
87 | │ ├── auth.js
88 | │ ├── github.js
89 | │ └── public.js
90 | ├── models/
91 | │ ├── migrations/
92 | │ ├── index.js
93 | │ └── user.js
94 | ├── services/
95 | │ └── github.js
96 | ├── static/
97 | │ ├── css/
98 | │ ├── img/
99 | │ └── favicon.ico
100 | ├── templates/
101 | │ ├── home/
102 | │ ├── layouts/
103 | │ ├── partials/
104 | │ └── tutorial/
105 | ├── index.js
106 | └── routes.js
107 | ```
108 |
109 | The core of the app is contained within the `app` directory. It contains `index.js`, the code to create and run the app, `/controllers`, handles all the endpoints and business logic, `/models`, handles all the features for the data models like users, `/templates`, contains the templates for [Handlebars](https://handlebarsjs.com/)-based layouts, and `/static`, contains all the static assets. You can learn more about [the structure of Express apps here](https://expressjs.com/en/starter/generator.html).
110 |
111 | ## Express Development
112 |
113 | Express is a minimal framework for developing web applications in JavaScript. That means it is easy to get started with a basic application without a lot of boilerplate. This also means it relies heavily on external libraries, or extensions, to add new functionality. You can learn more about how to use Express with [this guide](https://expressjs.com/en/guide/routing.html).
114 |
115 | ## OAuth Authentication
116 |
117 | This project uses GitHub OAuth to handle user authentication. Meaning a new user of your site will sign in with a GitHub account instead of a new username and password. This typically is more secure because you won't be storing new credentials for each user. It is also quicker and easier for the user. Win-win.
118 |
119 | The tradeoff is that you have to go through the [GitHub OAuth flow](https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/) with your application. This process is pretty simple:
120 |
121 | 1. Users clicked **Login with GitHub**.
122 | 2. Users are redirected to GitHub.com to request their identity.
123 | 3. Users grant permission to your app and are redirected back to your site.
124 | 4. Your app sends a request for the user access token.
125 | 5. Your app uses GitHub's API with the stored access token.
126 |
127 | The code that handles this process is contained in `controllers/auth.js` and `services/github.js`.
128 | To use this authentication technique you need to create a new GitHub OAuth app. [Instructions listed below](#github-oauth).
129 |
130 | ## Fetching Data
131 |
132 | This project uses the [axios](https://github.com/axios/axios) package to make HTTP requests. An example request would look like this:
133 |
134 | ```js
135 | const axios = require("axios");
136 |
137 | axios.get("/user?ID=12345").then(function(response) {
138 | // handle success
139 | console.log(response);
140 | });
141 |
142 | // Prints out results.
143 | ```
144 |
145 | These type of requests can be made inside of your controllers to fetch and store data for your application. For example, you might make a request to GitHub's API and display it directly in HTML. Depending on your needs, you can also store this data to your database to use later.
146 |
147 | To make things simple, we provide a service for GitHub-related requests, which will handle user authentication. Here is that [service in action](https://github.com/MLH/mlh-hackathon-nodejs-starter/blob/master/app/controllers/github.js).
148 |
149 | ## Static Files
150 |
151 | To serve static files such as images, CSS files, and JavaScript files, we use the `express.static` built-in middleware function in Express. These files located in the `/static` folder. The folder currently has some default files to get started.
152 |
153 | ```
154 | static/
155 | ├── css/
156 | | ├── color.css
157 | | └── style.css
158 | ├── img/
159 | | └── logo.png
160 | └── favicon.ico
161 | ```
162 |
163 | The `style.css` file is a good place to add custom CSS. Add any of your CSS or JavaScript in this folder.
164 |
165 | ## Saving to a Database
166 |
167 | ### Using Postgres
168 |
169 | Express does not come with a database layer by default. It is designed to have a database added later. You can add your own preferred database type to the project if needed. We like the PostgreSQL database which is easy to deploy with Heroku.
170 |
171 | To use PostgreSQL with your project, you will need to [install it locally](https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.4).
172 |
173 | 1. Install [Postgres locally](https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.4)\*
174 | 2. Make sure Postgres is running locally.
175 | 3. Replace the `DATABASE_URL` variable in `.env` with your database.
176 | - i.e. `DATABASE_URL=postgresql://localhost:5432/mlh-hackathon-nodejs-starter`
177 |
178 | \* A simple way for Mac OS X users to install Postgres is using [Postgres.app](https://postgresapp.com/).
179 |
180 | ### Sequelize
181 |
182 | This project uses [Sequelize](http://docs.sequelizejs.com/) for interacting with the database layer. It is a Node.js package that adds support for [PostrgreSQL](https://www.sqlalchemy.org/) to your application. It is a simple ORM that allows us to make SQL requests in JavaScript. This means instead of writing SQL directly, we can call object-based methods. Here is an example of creating and saving a user:
183 |
184 | ```js
185 | const user = await User.findAll({ where: { username: "octocat" } });
186 | console.log(user);
187 | ```
188 |
189 | This gives us flexibility in our database layer and keeps our JavaScript code clean of SQL commands. The data models located in the `/models` directory each use the `Sequelize` library.
190 |
191 | ## GitHub OAuth Apps
192 |
193 | This project uses a GitHub OAuth app for Authentication and uses GitHub's API. To setup GitHub for authentication, following these steps:
194 |
195 | 1. Register an account on Github.com.
196 | 2. Visit the [GitHub OAuth apps page](https://github.com/settings/developers).
197 | 3. Create a new OAuth app.
198 | - Enter an application name and a homepage URL.
199 | - Add callback URL, use http://localhost:5000/ for local development.
200 | - Click 'Register application'.
201 | 4. Add your GitHub credentials to your environment variables in `.env`.
202 | - Replace `[INSERT_CLIENT_ID]` with your GitHub Client ID.
203 | - Replace `[INSERT_CLIENT_SECRET]` with your GitHub Client Secret.
204 |
205 | ## Environment Variables
206 |
207 | To run the project, you need to configure the application to run locally. This will require updating a set of environment variables specific to your environment. Create a new file named `.env` by duplicating `.env.sample`. Update the new file with the GitHub credentials. It should look similar to this:
208 |
209 | ```
210 | # .env file
211 | DATABASE_URL="[INSERT_DATABASE_URL]"
212 | GITHUB_CLIENT_ID="[INSERT_CLIENT_ID]"
213 | GITHUB_CLIENT_SECRET="[INSERT_CLIENT_SECRET]"
214 | ```
215 |
216 | The `DATABASE_URL` variable is the path to your database system. This is where you can add the URL to your PostgreSQL.
217 |
218 | The `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` variables are the app credentials from your [GitHub OAuth app](https://github.com/settings/developers).
219 |
220 | ## Deployment
221 |
222 | ### Deploy to Heroku
223 |
224 | Heroku is an easy way for developers to deploy their application. To deploy to Heroku, make sure you have the [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) installed first. Then follow these steps:
225 |
226 | 1. Clone the code into a fresh folder: `git clone https://github.com/MLH/mlh-hackathon-nodejs-starter.git`
227 | 2. Navigate to the new folder: `cd mlh-hackathon-nodejs-starter`
228 | 3. Create a new Heroku app: `heroku create`
229 | 4. Push the code to Heroku with git: `git push heroku master`
230 | 5. Make sure the app builds and you can open it: `heroku open`
231 |
232 | Alternatively, you can use this button to create a new application on Heroku:
233 |
234 | [](https://heroku.com/deploy?template=https://github.com/MLH/mlh-hackathon-nodejs-starter)
235 |
236 | # Support
237 |
238 | If you are having problems running the project or getting it to work, check the [issue tracker][issues] for any related issues. It might also have the solution to your issue. If an issue doesn't already exist, feel free to open a new issue. We will try to respond as quickly as possible.
239 |
240 | You can also reach out to [our email][email] to help with more pressing issues.
241 |
242 | [mlh-contributing]: https://github.com/MLH/mlh-hackathon-nodejs-starter/blob/master/docs/CONTRIBUTING.md
243 | [issues]: https://github.com/MLH/mlh-hackathon-nodejs-starter/issues
244 | [email]: mailto:hi@mlh.io
245 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mlh-hackathon-nodejs-starter",
3 | "version": "0.1.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@sindresorhus/is": {
8 | "version": "0.14.0",
9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
10 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
11 | "dev": true
12 | },
13 | "@szmarczak/http-timer": {
14 | "version": "1.1.2",
15 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
16 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
17 | "dev": true,
18 | "requires": {
19 | "defer-to-connect": "^1.0.1"
20 | }
21 | },
22 | "@types/color-name": {
23 | "version": "1.1.1",
24 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
25 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
26 | "dev": true
27 | },
28 | "@types/node": {
29 | "version": "14.0.5",
30 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz",
31 | "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA=="
32 | },
33 | "abbrev": {
34 | "version": "1.1.1",
35 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
36 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
37 | "dev": true
38 | },
39 | "accepts": {
40 | "version": "1.3.7",
41 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
42 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
43 | "requires": {
44 | "mime-types": "~2.1.24",
45 | "negotiator": "0.6.2"
46 | }
47 | },
48 | "ansi-align": {
49 | "version": "3.0.0",
50 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
51 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
52 | "dev": true,
53 | "requires": {
54 | "string-width": "^3.0.0"
55 | },
56 | "dependencies": {
57 | "string-width": {
58 | "version": "3.1.0",
59 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
60 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
61 | "dev": true,
62 | "requires": {
63 | "emoji-regex": "^7.0.1",
64 | "is-fullwidth-code-point": "^2.0.0",
65 | "strip-ansi": "^5.1.0"
66 | }
67 | }
68 | }
69 | },
70 | "ansi-regex": {
71 | "version": "4.1.0",
72 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
73 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
74 | "dev": true
75 | },
76 | "ansi-styles": {
77 | "version": "4.2.1",
78 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
79 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
80 | "dev": true,
81 | "requires": {
82 | "@types/color-name": "^1.1.1",
83 | "color-convert": "^2.0.1"
84 | }
85 | },
86 | "any-promise": {
87 | "version": "1.3.0",
88 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
89 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
90 | },
91 | "anymatch": {
92 | "version": "3.1.1",
93 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
94 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
95 | "dev": true,
96 | "requires": {
97 | "normalize-path": "^3.0.0",
98 | "picomatch": "^2.0.4"
99 | }
100 | },
101 | "array-flatten": {
102 | "version": "1.1.1",
103 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
104 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
105 | },
106 | "asap": {
107 | "version": "2.0.6",
108 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
109 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
110 | },
111 | "axios": {
112 | "version": "0.19.2",
113 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
114 | "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
115 | "requires": {
116 | "follow-redirects": "1.5.10"
117 | }
118 | },
119 | "balanced-match": {
120 | "version": "1.0.0",
121 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
122 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
123 | },
124 | "basic-auth": {
125 | "version": "2.0.1",
126 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
127 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
128 | "requires": {
129 | "safe-buffer": "5.1.2"
130 | }
131 | },
132 | "binary-extensions": {
133 | "version": "2.0.0",
134 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
135 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
136 | "dev": true
137 | },
138 | "bluebird": {
139 | "version": "3.7.2",
140 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
141 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
142 | },
143 | "body-parser": {
144 | "version": "1.19.0",
145 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
146 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
147 | "requires": {
148 | "bytes": "3.1.0",
149 | "content-type": "~1.0.4",
150 | "debug": "2.6.9",
151 | "depd": "~1.1.2",
152 | "http-errors": "1.7.2",
153 | "iconv-lite": "0.4.24",
154 | "on-finished": "~2.3.0",
155 | "qs": "6.7.0",
156 | "raw-body": "2.4.0",
157 | "type-is": "~1.6.17"
158 | },
159 | "dependencies": {
160 | "bytes": {
161 | "version": "3.1.0",
162 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
163 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
164 | }
165 | }
166 | },
167 | "boxen": {
168 | "version": "4.2.0",
169 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
170 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
171 | "dev": true,
172 | "requires": {
173 | "ansi-align": "^3.0.0",
174 | "camelcase": "^5.3.1",
175 | "chalk": "^3.0.0",
176 | "cli-boxes": "^2.2.0",
177 | "string-width": "^4.1.0",
178 | "term-size": "^2.1.0",
179 | "type-fest": "^0.8.1",
180 | "widest-line": "^3.1.0"
181 | }
182 | },
183 | "brace-expansion": {
184 | "version": "1.1.11",
185 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
186 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
187 | "requires": {
188 | "balanced-match": "^1.0.0",
189 | "concat-map": "0.0.1"
190 | }
191 | },
192 | "braces": {
193 | "version": "3.0.2",
194 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
195 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
196 | "dev": true,
197 | "requires": {
198 | "fill-range": "^7.0.1"
199 | }
200 | },
201 | "buffer-writer": {
202 | "version": "2.0.0",
203 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
204 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
205 | },
206 | "bytes": {
207 | "version": "3.0.0",
208 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
209 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
210 | },
211 | "cacheable-request": {
212 | "version": "6.1.0",
213 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
214 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
215 | "dev": true,
216 | "requires": {
217 | "clone-response": "^1.0.2",
218 | "get-stream": "^5.1.0",
219 | "http-cache-semantics": "^4.0.0",
220 | "keyv": "^3.0.0",
221 | "lowercase-keys": "^2.0.0",
222 | "normalize-url": "^4.1.0",
223 | "responselike": "^1.0.2"
224 | },
225 | "dependencies": {
226 | "get-stream": {
227 | "version": "5.1.0",
228 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
229 | "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
230 | "dev": true,
231 | "requires": {
232 | "pump": "^3.0.0"
233 | }
234 | },
235 | "lowercase-keys": {
236 | "version": "2.0.0",
237 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
238 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
239 | "dev": true
240 | }
241 | }
242 | },
243 | "camelcase": {
244 | "version": "5.3.1",
245 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
246 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
247 | "dev": true
248 | },
249 | "chalk": {
250 | "version": "3.0.0",
251 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
252 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
253 | "dev": true,
254 | "requires": {
255 | "ansi-styles": "^4.1.0",
256 | "supports-color": "^7.1.0"
257 | },
258 | "dependencies": {
259 | "has-flag": {
260 | "version": "4.0.0",
261 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
262 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
263 | "dev": true
264 | },
265 | "supports-color": {
266 | "version": "7.1.0",
267 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
268 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
269 | "dev": true,
270 | "requires": {
271 | "has-flag": "^4.0.0"
272 | }
273 | }
274 | }
275 | },
276 | "chokidar": {
277 | "version": "3.4.0",
278 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz",
279 | "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==",
280 | "dev": true,
281 | "requires": {
282 | "anymatch": "~3.1.1",
283 | "braces": "~3.0.2",
284 | "fsevents": "~2.1.2",
285 | "glob-parent": "~5.1.0",
286 | "is-binary-path": "~2.1.0",
287 | "is-glob": "~4.0.1",
288 | "normalize-path": "~3.0.0",
289 | "readdirp": "~3.4.0"
290 | }
291 | },
292 | "ci-info": {
293 | "version": "2.0.0",
294 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
295 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
296 | "dev": true
297 | },
298 | "cli-boxes": {
299 | "version": "2.2.0",
300 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz",
301 | "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==",
302 | "dev": true
303 | },
304 | "clone-response": {
305 | "version": "1.0.2",
306 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
307 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
308 | "dev": true,
309 | "requires": {
310 | "mimic-response": "^1.0.0"
311 | }
312 | },
313 | "cls-bluebird": {
314 | "version": "2.1.0",
315 | "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz",
316 | "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=",
317 | "requires": {
318 | "is-bluebird": "^1.0.2",
319 | "shimmer": "^1.1.0"
320 | }
321 | },
322 | "color-convert": {
323 | "version": "2.0.1",
324 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
325 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
326 | "dev": true,
327 | "requires": {
328 | "color-name": "~1.1.4"
329 | }
330 | },
331 | "color-name": {
332 | "version": "1.1.4",
333 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
334 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
335 | "dev": true
336 | },
337 | "commander": {
338 | "version": "2.20.3",
339 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
340 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
341 | "optional": true
342 | },
343 | "compressible": {
344 | "version": "2.0.18",
345 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
346 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
347 | "requires": {
348 | "mime-db": ">= 1.43.0 < 2"
349 | }
350 | },
351 | "compression": {
352 | "version": "1.7.4",
353 | "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
354 | "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
355 | "requires": {
356 | "accepts": "~1.3.5",
357 | "bytes": "3.0.0",
358 | "compressible": "~2.0.16",
359 | "debug": "2.6.9",
360 | "on-headers": "~1.0.2",
361 | "safe-buffer": "5.1.2",
362 | "vary": "~1.1.2"
363 | }
364 | },
365 | "concat-map": {
366 | "version": "0.0.1",
367 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
368 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
369 | },
370 | "configstore": {
371 | "version": "5.0.1",
372 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
373 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
374 | "dev": true,
375 | "requires": {
376 | "dot-prop": "^5.2.0",
377 | "graceful-fs": "^4.1.2",
378 | "make-dir": "^3.0.0",
379 | "unique-string": "^2.0.0",
380 | "write-file-atomic": "^3.0.0",
381 | "xdg-basedir": "^4.0.0"
382 | }
383 | },
384 | "content-disposition": {
385 | "version": "0.5.3",
386 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
387 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
388 | "requires": {
389 | "safe-buffer": "5.1.2"
390 | }
391 | },
392 | "content-type": {
393 | "version": "1.0.4",
394 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
395 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
396 | },
397 | "cookie": {
398 | "version": "0.4.0",
399 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
400 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
401 | },
402 | "cookie-signature": {
403 | "version": "1.0.6",
404 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
405 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
406 | },
407 | "crypto-random-string": {
408 | "version": "2.0.0",
409 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
410 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
411 | "dev": true
412 | },
413 | "debug": {
414 | "version": "2.6.9",
415 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
416 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
417 | "requires": {
418 | "ms": "2.0.0"
419 | }
420 | },
421 | "decompress-response": {
422 | "version": "3.3.0",
423 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
424 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
425 | "dev": true,
426 | "requires": {
427 | "mimic-response": "^1.0.0"
428 | }
429 | },
430 | "deep-extend": {
431 | "version": "0.6.0",
432 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
433 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
434 | "dev": true
435 | },
436 | "defer-to-connect": {
437 | "version": "1.1.3",
438 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
439 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
440 | "dev": true
441 | },
442 | "define-properties": {
443 | "version": "1.1.3",
444 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
445 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
446 | "requires": {
447 | "object-keys": "^1.0.12"
448 | }
449 | },
450 | "depd": {
451 | "version": "1.1.2",
452 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
453 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
454 | },
455 | "destroy": {
456 | "version": "1.0.4",
457 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
458 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
459 | },
460 | "dot-prop": {
461 | "version": "5.2.0",
462 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
463 | "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
464 | "dev": true,
465 | "requires": {
466 | "is-obj": "^2.0.0"
467 | }
468 | },
469 | "dotenv": {
470 | "version": "8.2.0",
471 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
472 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
473 | },
474 | "dottie": {
475 | "version": "2.0.2",
476 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz",
477 | "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg=="
478 | },
479 | "duplexer3": {
480 | "version": "0.1.4",
481 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
482 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
483 | "dev": true
484 | },
485 | "ee-first": {
486 | "version": "1.1.1",
487 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
488 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
489 | },
490 | "emoji-regex": {
491 | "version": "7.0.3",
492 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
493 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
494 | "dev": true
495 | },
496 | "encodeurl": {
497 | "version": "1.0.2",
498 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
499 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
500 | },
501 | "end-of-stream": {
502 | "version": "1.4.4",
503 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
504 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
505 | "dev": true,
506 | "requires": {
507 | "once": "^1.4.0"
508 | }
509 | },
510 | "escape-goat": {
511 | "version": "2.1.1",
512 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
513 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
514 | "dev": true
515 | },
516 | "escape-html": {
517 | "version": "1.0.3",
518 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
519 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
520 | },
521 | "etag": {
522 | "version": "1.8.1",
523 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
524 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
525 | },
526 | "express": {
527 | "version": "4.17.1",
528 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
529 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
530 | "requires": {
531 | "accepts": "~1.3.7",
532 | "array-flatten": "1.1.1",
533 | "body-parser": "1.19.0",
534 | "content-disposition": "0.5.3",
535 | "content-type": "~1.0.4",
536 | "cookie": "0.4.0",
537 | "cookie-signature": "1.0.6",
538 | "debug": "2.6.9",
539 | "depd": "~1.1.2",
540 | "encodeurl": "~1.0.2",
541 | "escape-html": "~1.0.3",
542 | "etag": "~1.8.1",
543 | "finalhandler": "~1.1.2",
544 | "fresh": "0.5.2",
545 | "merge-descriptors": "1.0.1",
546 | "methods": "~1.1.2",
547 | "on-finished": "~2.3.0",
548 | "parseurl": "~1.3.3",
549 | "path-to-regexp": "0.1.7",
550 | "proxy-addr": "~2.0.5",
551 | "qs": "6.7.0",
552 | "range-parser": "~1.2.1",
553 | "safe-buffer": "5.1.2",
554 | "send": "0.17.1",
555 | "serve-static": "1.14.1",
556 | "setprototypeof": "1.1.1",
557 | "statuses": "~1.5.0",
558 | "type-is": "~1.6.18",
559 | "utils-merge": "1.0.1",
560 | "vary": "~1.1.2"
561 | }
562 | },
563 | "express-handlebars": {
564 | "version": "4.0.4",
565 | "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-4.0.4.tgz",
566 | "integrity": "sha512-WxbQorVc7V9ORzp9YpG3fLAzrfIrKcScSezuFxTZRFJSx/P2f7QJ9ZyADV8cyPuomyzUxAJnw6t8dnriLfBNvg==",
567 | "requires": {
568 | "glob": "^7.1.6",
569 | "graceful-fs": "^4.2.4",
570 | "handlebars": "^4.7.6",
571 | "object.assign": "^4.1.0",
572 | "promise": "^8.1.0"
573 | }
574 | },
575 | "express-session": {
576 | "version": "1.17.1",
577 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz",
578 | "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==",
579 | "requires": {
580 | "cookie": "0.4.0",
581 | "cookie-signature": "1.0.6",
582 | "debug": "2.6.9",
583 | "depd": "~2.0.0",
584 | "on-headers": "~1.0.2",
585 | "parseurl": "~1.3.3",
586 | "safe-buffer": "5.2.0",
587 | "uid-safe": "~2.1.5"
588 | },
589 | "dependencies": {
590 | "depd": {
591 | "version": "2.0.0",
592 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
593 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
594 | },
595 | "safe-buffer": {
596 | "version": "5.2.0",
597 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
598 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
599 | }
600 | }
601 | },
602 | "fill-range": {
603 | "version": "7.0.1",
604 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
605 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
606 | "dev": true,
607 | "requires": {
608 | "to-regex-range": "^5.0.1"
609 | }
610 | },
611 | "finalhandler": {
612 | "version": "1.1.2",
613 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
614 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
615 | "requires": {
616 | "debug": "2.6.9",
617 | "encodeurl": "~1.0.2",
618 | "escape-html": "~1.0.3",
619 | "on-finished": "~2.3.0",
620 | "parseurl": "~1.3.3",
621 | "statuses": "~1.5.0",
622 | "unpipe": "~1.0.0"
623 | }
624 | },
625 | "follow-redirects": {
626 | "version": "1.5.10",
627 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
628 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
629 | "requires": {
630 | "debug": "=3.1.0"
631 | },
632 | "dependencies": {
633 | "debug": {
634 | "version": "3.1.0",
635 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
636 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
637 | "requires": {
638 | "ms": "2.0.0"
639 | }
640 | }
641 | }
642 | },
643 | "forwarded": {
644 | "version": "0.1.2",
645 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
646 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
647 | },
648 | "fresh": {
649 | "version": "0.5.2",
650 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
651 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
652 | },
653 | "fs.realpath": {
654 | "version": "1.0.0",
655 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
656 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
657 | },
658 | "fsevents": {
659 | "version": "2.1.3",
660 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
661 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
662 | "dev": true,
663 | "optional": true
664 | },
665 | "function-bind": {
666 | "version": "1.1.1",
667 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
668 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
669 | },
670 | "get-stream": {
671 | "version": "4.1.0",
672 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
673 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
674 | "dev": true,
675 | "requires": {
676 | "pump": "^3.0.0"
677 | }
678 | },
679 | "glob": {
680 | "version": "7.1.6",
681 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
682 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
683 | "requires": {
684 | "fs.realpath": "^1.0.0",
685 | "inflight": "^1.0.4",
686 | "inherits": "2",
687 | "minimatch": "^3.0.4",
688 | "once": "^1.3.0",
689 | "path-is-absolute": "^1.0.0"
690 | }
691 | },
692 | "glob-parent": {
693 | "version": "5.1.1",
694 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
695 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
696 | "dev": true,
697 | "requires": {
698 | "is-glob": "^4.0.1"
699 | }
700 | },
701 | "global-dirs": {
702 | "version": "2.0.1",
703 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
704 | "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
705 | "dev": true,
706 | "requires": {
707 | "ini": "^1.3.5"
708 | }
709 | },
710 | "got": {
711 | "version": "9.6.0",
712 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
713 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
714 | "dev": true,
715 | "requires": {
716 | "@sindresorhus/is": "^0.14.0",
717 | "@szmarczak/http-timer": "^1.1.2",
718 | "cacheable-request": "^6.0.0",
719 | "decompress-response": "^3.3.0",
720 | "duplexer3": "^0.1.4",
721 | "get-stream": "^4.1.0",
722 | "lowercase-keys": "^1.0.1",
723 | "mimic-response": "^1.0.1",
724 | "p-cancelable": "^1.0.0",
725 | "to-readable-stream": "^1.0.0",
726 | "url-parse-lax": "^3.0.0"
727 | }
728 | },
729 | "graceful-fs": {
730 | "version": "4.2.4",
731 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
732 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
733 | },
734 | "handlebars": {
735 | "version": "4.7.6",
736 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
737 | "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
738 | "requires": {
739 | "minimist": "^1.2.5",
740 | "neo-async": "^2.6.0",
741 | "source-map": "^0.6.1",
742 | "uglify-js": "^3.1.4",
743 | "wordwrap": "^1.0.0"
744 | }
745 | },
746 | "has-flag": {
747 | "version": "3.0.0",
748 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
749 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
750 | "dev": true
751 | },
752 | "has-symbols": {
753 | "version": "1.0.1",
754 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
755 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
756 | },
757 | "has-yarn": {
758 | "version": "2.1.0",
759 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
760 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
761 | "dev": true
762 | },
763 | "http-cache-semantics": {
764 | "version": "4.1.0",
765 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
766 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
767 | "dev": true
768 | },
769 | "http-errors": {
770 | "version": "1.7.2",
771 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
772 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
773 | "requires": {
774 | "depd": "~1.1.2",
775 | "inherits": "2.0.3",
776 | "setprototypeof": "1.1.1",
777 | "statuses": ">= 1.5.0 < 2",
778 | "toidentifier": "1.0.0"
779 | }
780 | },
781 | "iconv-lite": {
782 | "version": "0.4.24",
783 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
784 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
785 | "requires": {
786 | "safer-buffer": ">= 2.1.2 < 3"
787 | }
788 | },
789 | "ignore-by-default": {
790 | "version": "1.0.1",
791 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
792 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
793 | "dev": true
794 | },
795 | "import-lazy": {
796 | "version": "2.1.0",
797 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
798 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
799 | "dev": true
800 | },
801 | "imurmurhash": {
802 | "version": "0.1.4",
803 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
804 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
805 | "dev": true
806 | },
807 | "inflection": {
808 | "version": "1.12.0",
809 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz",
810 | "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY="
811 | },
812 | "inflight": {
813 | "version": "1.0.6",
814 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
815 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
816 | "requires": {
817 | "once": "^1.3.0",
818 | "wrappy": "1"
819 | }
820 | },
821 | "inherits": {
822 | "version": "2.0.3",
823 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
824 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
825 | },
826 | "ini": {
827 | "version": "1.3.5",
828 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
829 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
830 | "dev": true
831 | },
832 | "ipaddr.js": {
833 | "version": "1.9.1",
834 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
835 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
836 | },
837 | "is-binary-path": {
838 | "version": "2.1.0",
839 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
840 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
841 | "dev": true,
842 | "requires": {
843 | "binary-extensions": "^2.0.0"
844 | }
845 | },
846 | "is-bluebird": {
847 | "version": "1.0.2",
848 | "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz",
849 | "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI="
850 | },
851 | "is-ci": {
852 | "version": "2.0.0",
853 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
854 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
855 | "dev": true,
856 | "requires": {
857 | "ci-info": "^2.0.0"
858 | }
859 | },
860 | "is-extglob": {
861 | "version": "2.1.1",
862 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
863 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
864 | "dev": true
865 | },
866 | "is-fullwidth-code-point": {
867 | "version": "2.0.0",
868 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
869 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
870 | "dev": true
871 | },
872 | "is-glob": {
873 | "version": "4.0.1",
874 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
875 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
876 | "dev": true,
877 | "requires": {
878 | "is-extglob": "^2.1.1"
879 | }
880 | },
881 | "is-installed-globally": {
882 | "version": "0.3.2",
883 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
884 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
885 | "dev": true,
886 | "requires": {
887 | "global-dirs": "^2.0.1",
888 | "is-path-inside": "^3.0.1"
889 | }
890 | },
891 | "is-npm": {
892 | "version": "4.0.0",
893 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
894 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
895 | "dev": true
896 | },
897 | "is-number": {
898 | "version": "7.0.0",
899 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
900 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
901 | "dev": true
902 | },
903 | "is-obj": {
904 | "version": "2.0.0",
905 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
906 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
907 | "dev": true
908 | },
909 | "is-path-inside": {
910 | "version": "3.0.2",
911 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
912 | "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
913 | "dev": true
914 | },
915 | "is-typedarray": {
916 | "version": "1.0.0",
917 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
918 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
919 | "dev": true
920 | },
921 | "is-yarn-global": {
922 | "version": "0.3.0",
923 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
924 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
925 | "dev": true
926 | },
927 | "json-buffer": {
928 | "version": "3.0.0",
929 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
930 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
931 | "dev": true
932 | },
933 | "keyv": {
934 | "version": "3.1.0",
935 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
936 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
937 | "dev": true,
938 | "requires": {
939 | "json-buffer": "3.0.0"
940 | }
941 | },
942 | "latest-version": {
943 | "version": "5.1.0",
944 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
945 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
946 | "dev": true,
947 | "requires": {
948 | "package-json": "^6.3.0"
949 | }
950 | },
951 | "lodash": {
952 | "version": "4.17.19",
953 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
954 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
955 | },
956 | "lowercase-keys": {
957 | "version": "1.0.1",
958 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
959 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
960 | "dev": true
961 | },
962 | "make-dir": {
963 | "version": "3.1.0",
964 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
965 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
966 | "dev": true,
967 | "requires": {
968 | "semver": "^6.0.0"
969 | }
970 | },
971 | "media-typer": {
972 | "version": "0.3.0",
973 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
974 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
975 | },
976 | "merge-descriptors": {
977 | "version": "1.0.1",
978 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
979 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
980 | },
981 | "methods": {
982 | "version": "1.1.2",
983 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
984 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
985 | },
986 | "mime": {
987 | "version": "1.6.0",
988 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
989 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
990 | },
991 | "mime-db": {
992 | "version": "1.44.0",
993 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
994 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
995 | },
996 | "mime-types": {
997 | "version": "2.1.27",
998 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
999 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
1000 | "requires": {
1001 | "mime-db": "1.44.0"
1002 | }
1003 | },
1004 | "mimic-response": {
1005 | "version": "1.0.1",
1006 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
1007 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
1008 | "dev": true
1009 | },
1010 | "minimatch": {
1011 | "version": "3.0.4",
1012 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1013 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1014 | "requires": {
1015 | "brace-expansion": "^1.1.7"
1016 | }
1017 | },
1018 | "minimist": {
1019 | "version": "1.2.5",
1020 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1021 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1022 | },
1023 | "moment": {
1024 | "version": "2.26.0",
1025 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
1026 | "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw=="
1027 | },
1028 | "moment-timezone": {
1029 | "version": "0.5.31",
1030 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
1031 | "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
1032 | "requires": {
1033 | "moment": ">= 2.9.0"
1034 | }
1035 | },
1036 | "morgan": {
1037 | "version": "1.10.0",
1038 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
1039 | "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
1040 | "requires": {
1041 | "basic-auth": "~2.0.1",
1042 | "debug": "2.6.9",
1043 | "depd": "~2.0.0",
1044 | "on-finished": "~2.3.0",
1045 | "on-headers": "~1.0.2"
1046 | },
1047 | "dependencies": {
1048 | "depd": {
1049 | "version": "2.0.0",
1050 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1051 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1052 | }
1053 | }
1054 | },
1055 | "ms": {
1056 | "version": "2.0.0",
1057 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1058 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1059 | },
1060 | "negotiator": {
1061 | "version": "0.6.2",
1062 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1063 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1064 | },
1065 | "neo-async": {
1066 | "version": "2.6.1",
1067 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
1068 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
1069 | },
1070 | "nodemon": {
1071 | "version": "2.0.4",
1072 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz",
1073 | "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==",
1074 | "dev": true,
1075 | "requires": {
1076 | "chokidar": "^3.2.2",
1077 | "debug": "^3.2.6",
1078 | "ignore-by-default": "^1.0.1",
1079 | "minimatch": "^3.0.4",
1080 | "pstree.remy": "^1.1.7",
1081 | "semver": "^5.7.1",
1082 | "supports-color": "^5.5.0",
1083 | "touch": "^3.1.0",
1084 | "undefsafe": "^2.0.2",
1085 | "update-notifier": "^4.0.0"
1086 | },
1087 | "dependencies": {
1088 | "debug": {
1089 | "version": "3.2.6",
1090 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1091 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1092 | "dev": true,
1093 | "requires": {
1094 | "ms": "^2.1.1"
1095 | }
1096 | },
1097 | "ms": {
1098 | "version": "2.1.2",
1099 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1100 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1101 | "dev": true
1102 | },
1103 | "semver": {
1104 | "version": "5.7.1",
1105 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1106 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1107 | "dev": true
1108 | }
1109 | }
1110 | },
1111 | "nopt": {
1112 | "version": "1.0.10",
1113 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1114 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1115 | "dev": true,
1116 | "requires": {
1117 | "abbrev": "1"
1118 | }
1119 | },
1120 | "normalize-path": {
1121 | "version": "3.0.0",
1122 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1123 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1124 | "dev": true
1125 | },
1126 | "normalize-url": {
1127 | "version": "4.5.0",
1128 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
1129 | "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
1130 | "dev": true
1131 | },
1132 | "object-keys": {
1133 | "version": "1.1.1",
1134 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1135 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
1136 | },
1137 | "object.assign": {
1138 | "version": "4.1.0",
1139 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1140 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1141 | "requires": {
1142 | "define-properties": "^1.1.2",
1143 | "function-bind": "^1.1.1",
1144 | "has-symbols": "^1.0.0",
1145 | "object-keys": "^1.0.11"
1146 | }
1147 | },
1148 | "on-finished": {
1149 | "version": "2.3.0",
1150 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1151 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1152 | "requires": {
1153 | "ee-first": "1.1.1"
1154 | }
1155 | },
1156 | "on-headers": {
1157 | "version": "1.0.2",
1158 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
1159 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
1160 | },
1161 | "once": {
1162 | "version": "1.4.0",
1163 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1164 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1165 | "requires": {
1166 | "wrappy": "1"
1167 | }
1168 | },
1169 | "p-cancelable": {
1170 | "version": "1.1.0",
1171 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
1172 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
1173 | "dev": true
1174 | },
1175 | "package-json": {
1176 | "version": "6.5.0",
1177 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
1178 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
1179 | "dev": true,
1180 | "requires": {
1181 | "got": "^9.6.0",
1182 | "registry-auth-token": "^4.0.0",
1183 | "registry-url": "^5.0.0",
1184 | "semver": "^6.2.0"
1185 | }
1186 | },
1187 | "packet-reader": {
1188 | "version": "1.0.0",
1189 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
1190 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
1191 | },
1192 | "parseurl": {
1193 | "version": "1.3.3",
1194 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1195 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1196 | },
1197 | "path-is-absolute": {
1198 | "version": "1.0.1",
1199 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1200 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1201 | },
1202 | "path-to-regexp": {
1203 | "version": "0.1.7",
1204 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1205 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1206 | },
1207 | "pg": {
1208 | "version": "8.2.1",
1209 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.2.1.tgz",
1210 | "integrity": "sha512-DKzffhpkWRr9jx7vKxA+ur79KG+SKw+PdjMb1IRhMiKI9zqYUGczwFprqy+5Veh/DCcFs1Y6V8lRLN5I1DlleQ==",
1211 | "requires": {
1212 | "buffer-writer": "2.0.0",
1213 | "packet-reader": "1.0.0",
1214 | "pg-connection-string": "^2.2.3",
1215 | "pg-pool": "^3.2.1",
1216 | "pg-protocol": "^1.2.4",
1217 | "pg-types": "^2.1.0",
1218 | "pgpass": "1.x",
1219 | "semver": "4.3.2"
1220 | },
1221 | "dependencies": {
1222 | "semver": {
1223 | "version": "4.3.2",
1224 | "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
1225 | "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c="
1226 | }
1227 | }
1228 | },
1229 | "pg-connection-string": {
1230 | "version": "2.2.3",
1231 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.2.3.tgz",
1232 | "integrity": "sha512-I/KCSQGmOrZx6sMHXkOs2MjddrYcqpza3Dtsy0AjIgBr/bZiPJRK9WhABXN1Uy1UDazRbi9gZEzO2sAhL5EqiQ=="
1233 | },
1234 | "pg-hstore": {
1235 | "version": "2.3.3",
1236 | "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.3.tgz",
1237 | "integrity": "sha512-qpeTpdkguFgfdoidtfeTho1Q1zPVPbtMHgs8eQ+Aan05iLmIs3Z3oo5DOZRclPGoQ4i68I1kCtQSJSa7i0ZVYg==",
1238 | "requires": {
1239 | "underscore": "^1.7.0"
1240 | }
1241 | },
1242 | "pg-int8": {
1243 | "version": "1.0.1",
1244 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
1245 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
1246 | },
1247 | "pg-pool": {
1248 | "version": "3.2.1",
1249 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.1.tgz",
1250 | "integrity": "sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA=="
1251 | },
1252 | "pg-protocol": {
1253 | "version": "1.2.4",
1254 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.2.4.tgz",
1255 | "integrity": "sha512-/8L/G+vW/VhWjTGXpGh8XVkXOFx1ZDY+Yuz//Ab8CfjInzFkreI+fDG3WjCeSra7fIZwAFxzbGptNbm8xSXenw=="
1256 | },
1257 | "pg-types": {
1258 | "version": "2.2.0",
1259 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
1260 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
1261 | "requires": {
1262 | "pg-int8": "1.0.1",
1263 | "postgres-array": "~2.0.0",
1264 | "postgres-bytea": "~1.0.0",
1265 | "postgres-date": "~1.0.4",
1266 | "postgres-interval": "^1.1.0"
1267 | }
1268 | },
1269 | "pgpass": {
1270 | "version": "1.0.2",
1271 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz",
1272 | "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=",
1273 | "requires": {
1274 | "split": "^1.0.0"
1275 | }
1276 | },
1277 | "picomatch": {
1278 | "version": "2.2.2",
1279 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
1280 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
1281 | "dev": true
1282 | },
1283 | "postgres-array": {
1284 | "version": "2.0.0",
1285 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
1286 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
1287 | },
1288 | "postgres-bytea": {
1289 | "version": "1.0.0",
1290 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
1291 | "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU="
1292 | },
1293 | "postgres-date": {
1294 | "version": "1.0.5",
1295 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.5.tgz",
1296 | "integrity": "sha512-pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA=="
1297 | },
1298 | "postgres-interval": {
1299 | "version": "1.2.0",
1300 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
1301 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
1302 | "requires": {
1303 | "xtend": "^4.0.0"
1304 | }
1305 | },
1306 | "prepend-http": {
1307 | "version": "2.0.0",
1308 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
1309 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
1310 | "dev": true
1311 | },
1312 | "promise": {
1313 | "version": "8.1.0",
1314 | "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
1315 | "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
1316 | "requires": {
1317 | "asap": "~2.0.6"
1318 | }
1319 | },
1320 | "proxy-addr": {
1321 | "version": "2.0.6",
1322 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
1323 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
1324 | "requires": {
1325 | "forwarded": "~0.1.2",
1326 | "ipaddr.js": "1.9.1"
1327 | }
1328 | },
1329 | "pstree.remy": {
1330 | "version": "1.1.8",
1331 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1332 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1333 | "dev": true
1334 | },
1335 | "pump": {
1336 | "version": "3.0.0",
1337 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1338 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1339 | "dev": true,
1340 | "requires": {
1341 | "end-of-stream": "^1.1.0",
1342 | "once": "^1.3.1"
1343 | }
1344 | },
1345 | "pupa": {
1346 | "version": "2.0.1",
1347 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
1348 | "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
1349 | "dev": true,
1350 | "requires": {
1351 | "escape-goat": "^2.0.0"
1352 | }
1353 | },
1354 | "qs": {
1355 | "version": "6.7.0",
1356 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
1357 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
1358 | },
1359 | "random-bytes": {
1360 | "version": "1.0.0",
1361 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
1362 | "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
1363 | },
1364 | "range-parser": {
1365 | "version": "1.2.1",
1366 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1367 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1368 | },
1369 | "raw-body": {
1370 | "version": "2.4.0",
1371 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
1372 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
1373 | "requires": {
1374 | "bytes": "3.1.0",
1375 | "http-errors": "1.7.2",
1376 | "iconv-lite": "0.4.24",
1377 | "unpipe": "1.0.0"
1378 | },
1379 | "dependencies": {
1380 | "bytes": {
1381 | "version": "3.1.0",
1382 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
1383 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
1384 | }
1385 | }
1386 | },
1387 | "rc": {
1388 | "version": "1.2.8",
1389 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1390 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1391 | "dev": true,
1392 | "requires": {
1393 | "deep-extend": "^0.6.0",
1394 | "ini": "~1.3.0",
1395 | "minimist": "^1.2.0",
1396 | "strip-json-comments": "~2.0.1"
1397 | }
1398 | },
1399 | "readdirp": {
1400 | "version": "3.4.0",
1401 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
1402 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
1403 | "dev": true,
1404 | "requires": {
1405 | "picomatch": "^2.2.1"
1406 | }
1407 | },
1408 | "registry-auth-token": {
1409 | "version": "4.1.1",
1410 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz",
1411 | "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==",
1412 | "dev": true,
1413 | "requires": {
1414 | "rc": "^1.2.8"
1415 | }
1416 | },
1417 | "registry-url": {
1418 | "version": "5.1.0",
1419 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
1420 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
1421 | "dev": true,
1422 | "requires": {
1423 | "rc": "^1.2.8"
1424 | }
1425 | },
1426 | "responselike": {
1427 | "version": "1.0.2",
1428 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
1429 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
1430 | "dev": true,
1431 | "requires": {
1432 | "lowercase-keys": "^1.0.0"
1433 | }
1434 | },
1435 | "retry-as-promised": {
1436 | "version": "3.2.0",
1437 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz",
1438 | "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==",
1439 | "requires": {
1440 | "any-promise": "^1.3.0"
1441 | }
1442 | },
1443 | "safe-buffer": {
1444 | "version": "5.1.2",
1445 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1446 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1447 | },
1448 | "safer-buffer": {
1449 | "version": "2.1.2",
1450 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1451 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1452 | },
1453 | "semver": {
1454 | "version": "6.3.0",
1455 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1456 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
1457 | },
1458 | "semver-diff": {
1459 | "version": "3.1.1",
1460 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
1461 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
1462 | "dev": true,
1463 | "requires": {
1464 | "semver": "^6.3.0"
1465 | }
1466 | },
1467 | "send": {
1468 | "version": "0.17.1",
1469 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1470 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1471 | "requires": {
1472 | "debug": "2.6.9",
1473 | "depd": "~1.1.2",
1474 | "destroy": "~1.0.4",
1475 | "encodeurl": "~1.0.2",
1476 | "escape-html": "~1.0.3",
1477 | "etag": "~1.8.1",
1478 | "fresh": "0.5.2",
1479 | "http-errors": "~1.7.2",
1480 | "mime": "1.6.0",
1481 | "ms": "2.1.1",
1482 | "on-finished": "~2.3.0",
1483 | "range-parser": "~1.2.1",
1484 | "statuses": "~1.5.0"
1485 | },
1486 | "dependencies": {
1487 | "ms": {
1488 | "version": "2.1.1",
1489 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1490 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1491 | }
1492 | }
1493 | },
1494 | "sequelize": {
1495 | "version": "5.21.10",
1496 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.21.10.tgz",
1497 | "integrity": "sha512-qni5lKIa4wBdbi3KQYj20R5TC0/a88qi/1XhGDzDvTaWxhx4gEpLr6aGwvfbvVD7XCilvOgjoBkBB0fLVpwNsw==",
1498 | "requires": {
1499 | "bluebird": "^3.5.0",
1500 | "cls-bluebird": "^2.1.0",
1501 | "debug": "^4.1.1",
1502 | "dottie": "^2.0.0",
1503 | "inflection": "1.12.0",
1504 | "lodash": "^4.17.15",
1505 | "moment": "^2.24.0",
1506 | "moment-timezone": "^0.5.21",
1507 | "retry-as-promised": "^3.2.0",
1508 | "semver": "^6.3.0",
1509 | "sequelize-pool": "^2.3.0",
1510 | "toposort-class": "^1.0.1",
1511 | "uuid": "^3.3.3",
1512 | "validator": "^10.11.0",
1513 | "wkx": "^0.4.8"
1514 | },
1515 | "dependencies": {
1516 | "debug": {
1517 | "version": "4.1.1",
1518 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
1519 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
1520 | "requires": {
1521 | "ms": "^2.1.1"
1522 | }
1523 | },
1524 | "ms": {
1525 | "version": "2.1.2",
1526 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1527 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1528 | }
1529 | }
1530 | },
1531 | "sequelize-pool": {
1532 | "version": "2.3.0",
1533 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz",
1534 | "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA=="
1535 | },
1536 | "serve-static": {
1537 | "version": "1.14.1",
1538 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1539 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1540 | "requires": {
1541 | "encodeurl": "~1.0.2",
1542 | "escape-html": "~1.0.3",
1543 | "parseurl": "~1.3.3",
1544 | "send": "0.17.1"
1545 | }
1546 | },
1547 | "setprototypeof": {
1548 | "version": "1.1.1",
1549 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1550 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1551 | },
1552 | "shimmer": {
1553 | "version": "1.2.1",
1554 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
1555 | "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
1556 | },
1557 | "signal-exit": {
1558 | "version": "3.0.3",
1559 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1560 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1561 | "dev": true
1562 | },
1563 | "source-map": {
1564 | "version": "0.6.1",
1565 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1566 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1567 | },
1568 | "split": {
1569 | "version": "1.0.1",
1570 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
1571 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
1572 | "requires": {
1573 | "through": "2"
1574 | }
1575 | },
1576 | "statuses": {
1577 | "version": "1.5.0",
1578 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1579 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1580 | },
1581 | "string-width": {
1582 | "version": "4.2.0",
1583 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
1584 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
1585 | "dev": true,
1586 | "requires": {
1587 | "emoji-regex": "^8.0.0",
1588 | "is-fullwidth-code-point": "^3.0.0",
1589 | "strip-ansi": "^6.0.0"
1590 | },
1591 | "dependencies": {
1592 | "ansi-regex": {
1593 | "version": "5.0.0",
1594 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
1595 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
1596 | "dev": true
1597 | },
1598 | "emoji-regex": {
1599 | "version": "8.0.0",
1600 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1601 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1602 | "dev": true
1603 | },
1604 | "is-fullwidth-code-point": {
1605 | "version": "3.0.0",
1606 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1607 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1608 | "dev": true
1609 | },
1610 | "strip-ansi": {
1611 | "version": "6.0.0",
1612 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
1613 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
1614 | "dev": true,
1615 | "requires": {
1616 | "ansi-regex": "^5.0.0"
1617 | }
1618 | }
1619 | }
1620 | },
1621 | "strip-ansi": {
1622 | "version": "5.2.0",
1623 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1624 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1625 | "dev": true,
1626 | "requires": {
1627 | "ansi-regex": "^4.1.0"
1628 | }
1629 | },
1630 | "strip-json-comments": {
1631 | "version": "2.0.1",
1632 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1633 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1634 | "dev": true
1635 | },
1636 | "supports-color": {
1637 | "version": "5.5.0",
1638 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1639 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1640 | "dev": true,
1641 | "requires": {
1642 | "has-flag": "^3.0.0"
1643 | }
1644 | },
1645 | "term-size": {
1646 | "version": "2.2.0",
1647 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
1648 | "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
1649 | "dev": true
1650 | },
1651 | "through": {
1652 | "version": "2.3.8",
1653 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1654 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
1655 | },
1656 | "to-readable-stream": {
1657 | "version": "1.0.0",
1658 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
1659 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
1660 | "dev": true
1661 | },
1662 | "to-regex-range": {
1663 | "version": "5.0.1",
1664 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1665 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1666 | "dev": true,
1667 | "requires": {
1668 | "is-number": "^7.0.0"
1669 | }
1670 | },
1671 | "toidentifier": {
1672 | "version": "1.0.0",
1673 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1674 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1675 | },
1676 | "toposort-class": {
1677 | "version": "1.0.1",
1678 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
1679 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg="
1680 | },
1681 | "touch": {
1682 | "version": "3.1.0",
1683 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1684 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1685 | "dev": true,
1686 | "requires": {
1687 | "nopt": "~1.0.10"
1688 | }
1689 | },
1690 | "type-fest": {
1691 | "version": "0.8.1",
1692 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
1693 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
1694 | "dev": true
1695 | },
1696 | "type-is": {
1697 | "version": "1.6.18",
1698 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1699 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1700 | "requires": {
1701 | "media-typer": "0.3.0",
1702 | "mime-types": "~2.1.24"
1703 | }
1704 | },
1705 | "typedarray-to-buffer": {
1706 | "version": "3.1.5",
1707 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
1708 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
1709 | "dev": true,
1710 | "requires": {
1711 | "is-typedarray": "^1.0.0"
1712 | }
1713 | },
1714 | "uglify-js": {
1715 | "version": "3.9.3",
1716 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.3.tgz",
1717 | "integrity": "sha512-r5ImcL6QyzQGVimQoov3aL2ZScywrOgBXGndbWrdehKoSvGe/RmiE5Jpw/v+GvxODt6l2tpBXwA7n+qZVlHBMA==",
1718 | "optional": true,
1719 | "requires": {
1720 | "commander": "~2.20.3"
1721 | }
1722 | },
1723 | "uid-safe": {
1724 | "version": "2.1.5",
1725 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
1726 | "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
1727 | "requires": {
1728 | "random-bytes": "~1.0.0"
1729 | }
1730 | },
1731 | "undefsafe": {
1732 | "version": "2.0.3",
1733 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
1734 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
1735 | "dev": true,
1736 | "requires": {
1737 | "debug": "^2.2.0"
1738 | }
1739 | },
1740 | "underscore": {
1741 | "version": "1.10.2",
1742 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz",
1743 | "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg=="
1744 | },
1745 | "unique-string": {
1746 | "version": "2.0.0",
1747 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
1748 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
1749 | "dev": true,
1750 | "requires": {
1751 | "crypto-random-string": "^2.0.0"
1752 | }
1753 | },
1754 | "unpipe": {
1755 | "version": "1.0.0",
1756 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1757 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1758 | },
1759 | "update-notifier": {
1760 | "version": "4.1.0",
1761 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz",
1762 | "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==",
1763 | "dev": true,
1764 | "requires": {
1765 | "boxen": "^4.2.0",
1766 | "chalk": "^3.0.0",
1767 | "configstore": "^5.0.1",
1768 | "has-yarn": "^2.1.0",
1769 | "import-lazy": "^2.1.0",
1770 | "is-ci": "^2.0.0",
1771 | "is-installed-globally": "^0.3.1",
1772 | "is-npm": "^4.0.0",
1773 | "is-yarn-global": "^0.3.0",
1774 | "latest-version": "^5.0.0",
1775 | "pupa": "^2.0.1",
1776 | "semver-diff": "^3.1.1",
1777 | "xdg-basedir": "^4.0.0"
1778 | }
1779 | },
1780 | "url-parse-lax": {
1781 | "version": "3.0.0",
1782 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
1783 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
1784 | "dev": true,
1785 | "requires": {
1786 | "prepend-http": "^2.0.0"
1787 | }
1788 | },
1789 | "utils-merge": {
1790 | "version": "1.0.1",
1791 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1792 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1793 | },
1794 | "uuid": {
1795 | "version": "3.4.0",
1796 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1797 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
1798 | },
1799 | "validator": {
1800 | "version": "10.11.0",
1801 | "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
1802 | "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw=="
1803 | },
1804 | "vary": {
1805 | "version": "1.1.2",
1806 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1807 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1808 | },
1809 | "widest-line": {
1810 | "version": "3.1.0",
1811 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
1812 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
1813 | "dev": true,
1814 | "requires": {
1815 | "string-width": "^4.0.0"
1816 | }
1817 | },
1818 | "wkx": {
1819 | "version": "0.4.8",
1820 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz",
1821 | "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==",
1822 | "requires": {
1823 | "@types/node": "*"
1824 | }
1825 | },
1826 | "wordwrap": {
1827 | "version": "1.0.0",
1828 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1829 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
1830 | },
1831 | "wrappy": {
1832 | "version": "1.0.2",
1833 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1834 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1835 | },
1836 | "write-file-atomic": {
1837 | "version": "3.0.3",
1838 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
1839 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
1840 | "dev": true,
1841 | "requires": {
1842 | "imurmurhash": "^0.1.4",
1843 | "is-typedarray": "^1.0.0",
1844 | "signal-exit": "^3.0.2",
1845 | "typedarray-to-buffer": "^3.1.5"
1846 | }
1847 | },
1848 | "xdg-basedir": {
1849 | "version": "4.0.0",
1850 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
1851 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
1852 | "dev": true
1853 | },
1854 | "xtend": {
1855 | "version": "4.0.2",
1856 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1857 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
1858 | }
1859 | }
1860 | }
1861 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mlh-hackathon-nodejs-starter",
3 | "version": "0.1.0",
4 | "description": "A hackathon starting point for new Nodejs applications",
5 | "scripts": {
6 | "start": "nodemon app/index.js",
7 | "deploy": "NODE_ENV=production node app/index.js"
8 | },
9 | "dependencies": {
10 | "axios": "^0.19.2",
11 | "compression": "^1.7.3",
12 | "dotenv": "^8.2.0",
13 | "express": "^4.16.4",
14 | "express-handlebars": "^4.0.4",
15 | "express-session": "^1.15.6",
16 | "morgan": "^1.9.1",
17 | "pg": "^8.2.1",
18 | "pg-hstore": "^2.3.2",
19 | "sequelize": ">=5.3.0"
20 | },
21 | "devDependencies": {
22 | "nodemon": "^2.0.4"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------