├── .gitignore
├── ProcFile
├── README.md
├── backend
├── config
│ └── db.js
├── controllers
│ ├── noteController.js
│ └── userController.js
├── data
│ └── notes.js
├── middleware
│ ├── authMiddleware.js
│ └── errorMiddleware.js
├── models
│ ├── noteModel.js
│ └── userModel.js
├── routes
│ ├── noteRoutes.js
│ └── userRoutes.js
├── seeder.js
├── server.js
└── utils
│ └── generateToken.js
├── frontend
├── README.md
├── package-lock.json
├── package.json
├── public
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
├── src
│ ├── App.css
│ ├── App.js
│ ├── actions
│ │ ├── notesActions.js
│ │ └── userActions.js
│ ├── background.jpg
│ ├── background.webp
│ ├── background1.jpg
│ ├── bootstrap.min.css
│ ├── components
│ │ ├── ErrorMessage.js
│ │ ├── Footer.js
│ │ ├── Header.js
│ │ ├── Loading.js
│ │ ├── MainScreen.js
│ │ └── Screen.css
│ ├── constants
│ │ ├── notesConstants.js
│ │ └── userConstants.js
│ ├── index.css
│ ├── index.js
│ ├── reducers
│ │ ├── notesReducers.js
│ │ └── userReducers.js
│ ├── reportWebVitals.js
│ ├── screens
│ │ ├── LandingPage
│ │ │ ├── LandingPage.js
│ │ │ └── LandingStyles.css
│ │ ├── LoginScreen
│ │ │ ├── LoginScreen.css
│ │ │ └── LoginScreen.js
│ │ ├── MyNotes
│ │ │ └── MyNotes.js
│ │ ├── ProfileScreen
│ │ │ ├── ProfileScreen.css
│ │ │ └── ProfileScreen.js
│ │ ├── RegisterScreen
│ │ │ ├── RegisterScreen.css
│ │ │ └── RegisterScreen.js
│ │ └── SingleNote
│ │ │ ├── CreateNote.js
│ │ │ └── SingleNote.js
│ └── store.js
└── yarn.lock
├── images
├── allnotes.png
├── create.png
├── edit.png
├── landing.png
├── login.png
└── profile.png
├── package-lock.json
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | node_modules/
3 | /frontend/node_modules/
4 | .env
--------------------------------------------------------------------------------
/ProcFile:
--------------------------------------------------------------------------------
1 | web: node backend/server.js
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Note Zipper
2 |
3 |
4 |
5 | Note Zipper provides you one safe place for all your notes.
6 | |
7 |
8 |
9 |
10 | # 
11 |
12 | ## [Click Here to Watch Full tutorial on Youtube](https://www.youtube.com/watch?v=IQXjO0t4XRM&list=PLKhlp2qtUcSYC7EffnHzD-Ws2xG-j3aYo)
13 | 
14 |
15 | ## Demo
16 | Here is a working live demo : https://notezipper.herokuapp.com/
17 |
18 | ## Site
19 |
20 | ### Landing Page
21 |
22 | 
23 |
24 | ### Login Form
25 | You can register a new account or login with an existing one.
26 |
27 | 
28 |
29 | ### Edit Profile
30 |
31 | 
32 |
33 | ### Create a Note
34 |
35 | 
36 |
37 | ### All Notes
38 |
39 | 
40 |
41 | ### Edit Note
42 |
43 | 
44 |
45 | ## Built with
46 |
47 | - [React JS](https://reactjs.org/)
48 | - [Node JS](https://nodejs.org/)
49 | - [Express JS](https://expressjs.com/)
50 | - [Mongo DB](https://www.mongodb.com/)
51 | - [Bootstrap](http://getbootstrap.com/)
52 |
53 | ## Team
54 |
55 | [](https://github.com/piyush-eon)
56 |
57 | MIT © [Piyush Agarwal ](https://github.com/piyush-eon)
58 |
59 |
--------------------------------------------------------------------------------
/backend/config/db.js:
--------------------------------------------------------------------------------
1 | //Connection file to mongo db
2 | import mongoose from "mongoose";
3 | import colors from "colors";
4 |
5 | const connectDB = async () => {
6 | try {
7 | const conn = await mongoose.connect(process.env.MONGO_URI, {
8 | useUnifiedTopology: true,
9 | useNewUrlParser: true,
10 | useCreateIndex: true,
11 | });
12 | console.log(`MongoDB Connected: ${conn.connection.host}`.cyan.underline);
13 | } catch (error) {
14 | console.error(`Error: ${error.message}`.red.bold);
15 | process.exit();
16 | }
17 | };
18 |
19 | export default connectDB;
20 |
--------------------------------------------------------------------------------
/backend/controllers/noteController.js:
--------------------------------------------------------------------------------
1 | import Note from "../models/noteModel.js";
2 | import asyncHandler from "express-async-handler";
3 |
4 | // @desc Get logged in user notes
5 | // @route GET /api/notes
6 | // @access Private
7 | const getNotes = asyncHandler(async (req, res) => {
8 | const notes = await Note.find({ user: req.user._id });
9 | res.json(notes);
10 | });
11 |
12 | //@description Fetch single Note
13 | //@route GET /api/notes/:id
14 | //@access Public
15 | const getNoteById = asyncHandler(async (req, res) => {
16 | const note = await Note.findById(req.params.id);
17 |
18 | if (note) {
19 | res.json(note);
20 | } else {
21 | res.status(404).json({ message: "Note not found" });
22 | }
23 |
24 | res.json(note);
25 | });
26 |
27 | //@description Create single Note
28 | //@route GET /api/notes/create
29 | //@access Private
30 | const CreateNote = asyncHandler(async (req, res) => {
31 | const { title, content, category } = req.body;
32 |
33 | if (!title || !content || !category) {
34 | res.status(400);
35 | throw new Error("Please Fill all the feilds");
36 | return;
37 | } else {
38 | const note = new Note({ user: req.user._id, title, content, category });
39 |
40 | const createdNote = await note.save();
41 |
42 | res.status(201).json(createdNote);
43 | }
44 | });
45 |
46 | //@description Delete single Note
47 | //@route GET /api/notes/:id
48 | //@access Private
49 | const DeleteNote = asyncHandler(async (req, res) => {
50 | const note = await Note.findById(req.params.id);
51 |
52 | if (note.user.toString() !== req.user._id.toString()) {
53 | res.status(401);
54 | throw new Error("You can't perform this action");
55 | }
56 |
57 | if (note) {
58 | await note.remove();
59 | res.json({ message: "Note Removed" });
60 | } else {
61 | res.status(404);
62 | throw new Error("Note not Found");
63 | }
64 | });
65 |
66 | // @desc Update a note
67 | // @route PUT /api/notes/:id
68 | // @access Private
69 | const UpdateNote = asyncHandler(async (req, res) => {
70 | const { title, content, category } = req.body;
71 |
72 | const note = await Note.findById(req.params.id);
73 |
74 | if (note.user.toString() !== req.user._id.toString()) {
75 | res.status(401);
76 | throw new Error("You can't perform this action");
77 | }
78 |
79 | if (note) {
80 | note.title = title;
81 | note.content = content;
82 | note.category = category;
83 |
84 | const updatedNote = await note.save();
85 | res.json(updatedNote);
86 | } else {
87 | res.status(404);
88 | throw new Error("Note not found");
89 | }
90 | });
91 |
92 | export { getNoteById, getNotes, CreateNote, DeleteNote, UpdateNote };
93 |
--------------------------------------------------------------------------------
/backend/controllers/userController.js:
--------------------------------------------------------------------------------
1 | import asyncHandler from "express-async-handler";
2 | import User from "../models/userModel.js";
3 | import generateToken from "../utils/generateToken.js";
4 |
5 | //@description Auth the user
6 | //@route POST /api/users/login
7 | //@access Public
8 | const authUser = asyncHandler(async (req, res) => {
9 | const { email, password } = req.body;
10 |
11 | const user = await User.findOne({ email });
12 |
13 | if (user && (await user.matchPassword(password))) {
14 | res.json({
15 | _id: user._id,
16 | name: user.name,
17 | email: user.email,
18 | isAdmin: user.isAdmin,
19 | pic: user.pic,
20 | token: generateToken(user._id),
21 | });
22 | } else {
23 | res.status(401);
24 | throw new Error("Invalid Email or Password");
25 | }
26 | });
27 |
28 | //@description Register new user
29 | //@route POST /api/users/
30 | //@access Public
31 | const registerUser = asyncHandler(async (req, res) => {
32 | const { name, email, password, pic } = req.body;
33 |
34 | const userExists = await User.findOne({ email });
35 |
36 | if (userExists) {
37 | res.status(404);
38 | throw new Error("User already exists");
39 | }
40 |
41 | const user = await User.create({
42 | name,
43 | email,
44 | password,
45 | pic,
46 | });
47 |
48 | if (user) {
49 | res.status(201).json({
50 | _id: user._id,
51 | name: user.name,
52 | email: user.email,
53 | isAdmin: user.isAdmin,
54 | pic: user.pic,
55 | token: generateToken(user._id),
56 | });
57 | } else {
58 | res.status(400);
59 | throw new Error("User not found");
60 | }
61 | });
62 |
63 | // @desc GET user profile
64 | // @route GET /api/users/profile
65 | // @access Private
66 | const updateUserProfile = asyncHandler(async (req, res) => {
67 | const user = await User.findById(req.user._id);
68 |
69 | if (user) {
70 | user.name = req.body.name || user.name;
71 | user.email = req.body.email || user.email;
72 | user.pic = req.body.pic || user.pic;
73 | if (req.body.password) {
74 | user.password = req.body.password;
75 | }
76 |
77 | const updatedUser = await user.save();
78 |
79 | res.json({
80 | _id: updatedUser._id,
81 | name: updatedUser.name,
82 | email: updatedUser.email,
83 | pic: updatedUser.pic,
84 | isAdmin: updatedUser.isAdmin,
85 | token: generateToken(updatedUser._id),
86 | });
87 | } else {
88 | res.status(404);
89 | throw new Error("User Not Found");
90 | }
91 | });
92 |
93 | export { authUser, updateUserProfile, registerUser };
94 |
--------------------------------------------------------------------------------
/backend/data/notes.js:
--------------------------------------------------------------------------------
1 | const notes = [
2 | {
3 | _id: "1",
4 | title: "Day 1 of college",
5 | content:
6 | "I made a few new friends and introduced myself to a lot of new teachers.",
7 | category: "College",
8 | },
9 | {
10 | _id: "2",
11 | title: "Learned some Node JS",
12 | content: "Learned how to create a server in node JS and my first API",
13 | category: "Learning",
14 | },
15 | {
16 | _id: "3",
17 | title: "Watched some Anime",
18 | content: "Finished 2 seasons of Attack on Titan and My Hero academia.",
19 | category: "Entertainment",
20 | },
21 | {
22 | _id: 4,
23 | title: "Started React JS",
24 | content:
25 | "Made my first App in React JS, feels awesome to learn something new. I aim to be a full stack dev someday",
26 | category: "Learning",
27 | },
28 | ];
29 |
30 | module.exports = notes;
31 |
--------------------------------------------------------------------------------
/backend/middleware/authMiddleware.js:
--------------------------------------------------------------------------------
1 | import jwt from "jsonwebtoken";
2 | import User from "../models/userModel.js";
3 | import asyncHandler from "express-async-handler";
4 |
5 | const protect = asyncHandler(async (req, res, next) => {
6 | let token;
7 |
8 | if (
9 | req.headers.authorization &&
10 | req.headers.authorization.startsWith("Bearer")
11 | ) {
12 | try {
13 | token = req.headers.authorization.split(" ")[1];
14 |
15 | //decodes token id
16 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
17 |
18 | req.user = await User.findById(decoded.id).select("-password");
19 |
20 | next();
21 | } catch (error) {
22 | res.status(401);
23 | throw new Error("Not authorized, token failed");
24 | }
25 | }
26 |
27 | if (!token) {
28 | res.status(401);
29 | throw new Error("Not authorized, no token");
30 | }
31 | });
32 |
33 | export { protect };
34 |
--------------------------------------------------------------------------------
/backend/middleware/errorMiddleware.js:
--------------------------------------------------------------------------------
1 | const notFound = (req, res, next) => {
2 | const error = new Error(`Not Found - ${req.originalUrl}`);
3 | res.status(404);
4 | next(error);
5 | };
6 |
7 | const errorHandler = (err, req, res, next) => {
8 | const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
9 | res.status(statusCode);
10 | res.json({
11 | message: err.message,
12 | stack: process.env.NODE_ENV === "production" ? null : err.stack,
13 | });
14 | };
15 |
16 | export { notFound, errorHandler };
17 |
--------------------------------------------------------------------------------
/backend/models/noteModel.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 |
3 | const noteSchema = mongoose.Schema(
4 | {
5 | title: {
6 | type: String,
7 | required: true,
8 | },
9 | content: {
10 | type: String,
11 | required: true,
12 | },
13 | category: {
14 | type: String,
15 | required: true,
16 | },
17 | user: {
18 | type: mongoose.Schema.Types.ObjectId,
19 | required: true,
20 | ref: "User",
21 | },
22 | },
23 | {
24 | timestamps: true,
25 | }
26 | );
27 |
28 | const Note = mongoose.model("Note", noteSchema);
29 |
30 | export default Note;
31 |
--------------------------------------------------------------------------------
/backend/models/userModel.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 | import bcrypt from "bcryptjs";
3 |
4 | const userSchema = mongoose.Schema(
5 | {
6 | name: {
7 | type: String,
8 | required: true,
9 | },
10 | email: {
11 | type: String,
12 | required: true,
13 | unique: true,
14 | },
15 | password: {
16 | type: String,
17 | required: true,
18 | },
19 | isAdmin: {
20 | type: Boolean,
21 | required: true,
22 | default: false,
23 | },
24 | pic: {
25 | type: String,
26 | required: true,
27 | default:
28 | "https://icon-library.com/images/anonymous-avatar-icon/anonymous-avatar-icon-25.jpg",
29 | },
30 | },
31 | {
32 | timestamps: true,
33 | }
34 | );
35 |
36 | userSchema.methods.matchPassword = async function (enteredPassword) {
37 | return await bcrypt.compare(enteredPassword, this.password);
38 | };
39 |
40 | // will encrypt password everytime its saved
41 | userSchema.pre("save", async function (next) {
42 | if (!this.isModified("password")) {
43 | next();
44 | }
45 | const salt = await bcrypt.genSalt(10);
46 | this.password = await bcrypt.hash(this.password, salt);
47 | });
48 |
49 | const User = mongoose.model("User", userSchema);
50 |
51 | export default User;
52 |
--------------------------------------------------------------------------------
/backend/routes/noteRoutes.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import {
3 | getNoteById,
4 | getNotes,
5 | CreateNote,
6 | DeleteNote,
7 | UpdateNote,
8 | } from "../controllers/noteController.js";
9 | const router = express.Router();
10 | import { protect } from "../middleware/authMiddleware.js";
11 |
12 | router.route("/").get(protect, getNotes);
13 | router
14 | .route("/:id")
15 | .get(getNoteById)
16 | .delete(protect, DeleteNote)
17 | .put(protect, UpdateNote);
18 | router.route("/create").post(protect, CreateNote);
19 |
20 | export default router;
21 |
--------------------------------------------------------------------------------
/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import {
3 | authUser,
4 | registerUser,
5 | updateUserProfile,
6 | } from "../controllers/userController.js";
7 | import { protect } from "../middleware/authMiddleware.js";
8 | const router = express.Router();
9 |
10 | router.route("/").post(registerUser);
11 | router.post("/login", authUser);
12 | router.route("/profile").post(protect, updateUserProfile);
13 |
14 | export default router;
15 |
--------------------------------------------------------------------------------
/backend/seeder.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 | import dotenv from "dotenv";
3 | import colors from "colors";
4 | import users from "./data/users.js";
5 | import notes from "./data/notes.js";
6 | import User from "./models/userModel.js";
7 | import Note from "./models/noteModel.js";
8 | import connectDB from "./config/db.js";
9 |
10 | dotenv.config();
11 |
12 | connectDB();
13 |
14 | const importData = async () => {
15 | try {
16 | await Note.deleteMany();
17 | await User.deleteMany();
18 |
19 | const createdUsers = await User.insertMany(users);
20 |
21 | const adminUser = createdUsers[0]._id;
22 |
23 | const sampleNotes = notes.map((note) => {
24 | return { ...note, user: adminUser };
25 | });
26 |
27 | await Note.insertMany(sampleNotes);
28 |
29 | console.log("Data Imported!".green.inverse);
30 | process.exit();
31 | } catch (error) {
32 | console.error(`${error}`.red.inverse);
33 | process.exit(1);
34 | }
35 | };
36 |
37 | const destroyData = async () => {
38 | try {
39 | await Note.deleteMany();
40 | await User.deleteMany();
41 |
42 | console.log("Data Destroyed!".red.inverse);
43 | process.exit();
44 | } catch (error) {
45 | console.error(`${error}`.red.inverse);
46 | process.exit(1);
47 | }
48 | };
49 |
50 | if (process.argv[2] === "-d") {
51 | destroyData();
52 | } else {
53 | importData();
54 | }
55 |
--------------------------------------------------------------------------------
/backend/server.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import dotenv from "dotenv";
3 | import connectDB from "./config/db.js";
4 | import colors from "colors";
5 | import path from "path";
6 |
7 | import noteRoutes from "./routes/noteRoutes.js";
8 | import userRoutes from "./routes/userRoutes.js";
9 | import { errorHandler, notFound } from "./middleware/errorMiddleware.js";
10 |
11 | dotenv.config();
12 |
13 | connectDB();
14 |
15 | const app = express(); // main thing
16 |
17 | app.use(express.json()); // to accept json data
18 |
19 | app.use("/api/notes", noteRoutes);
20 | app.use("/api/users", userRoutes);
21 |
22 | // --------------------------deployment------------------------------
23 | const __dirname = path.resolve();
24 |
25 | if (process.env.NODE_ENV === "production") {
26 | app.use(express.static(path.join(__dirname, "/frontend/build")));
27 |
28 | app.get("*", (req, res) =>
29 | res.sendFile(path.resolve(__dirname, "frontend", "build", "index.html"))
30 | );
31 | } else {
32 | app.get("/", (req, res) => {
33 | res.send("API is running..");
34 | });
35 | }
36 | // --------------------------deployment------------------------------
37 |
38 | // Error Handling middlewares
39 | app.use(notFound);
40 | app.use(errorHandler);
41 |
42 | const PORT = process.env.PORT || 5000;
43 |
44 | app.listen(
45 | PORT,
46 | console.log(
47 | `Server running in ${process.env.NODE_ENV} mode on port ${PORT}..`.yellow
48 | .bold
49 | )
50 | );
51 |
--------------------------------------------------------------------------------
/backend/utils/generateToken.js:
--------------------------------------------------------------------------------
1 | import jwt from "jsonwebtoken";
2 |
3 | const generateToken = (id) => {
4 | return jwt.sign({ id }, process.env.JWT_SECRET, {
5 | expiresIn: "30d",
6 | });
7 | };
8 |
9 | export default generateToken;
10 |
--------------------------------------------------------------------------------
/frontend/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `yarn start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
13 |
14 | The page will reload if you make edits.\
15 | You will also see any lint errors in the console.
16 |
17 | ### `yarn test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `yarn build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `yarn eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
35 |
36 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
39 |
40 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `yarn build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 |
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "proxy": "http://127.0.0.1:5000",
4 | "version": "0.1.0",
5 | "private": true,
6 | "dependencies": {
7 | "@testing-library/jest-dom": "^5.11.4",
8 | "@testing-library/react": "^11.1.0",
9 | "@testing-library/user-event": "^12.1.10",
10 | "axios": "^0.21.0",
11 | "react": "^17.0.1",
12 | "react-bootstrap": "^1.4.0",
13 | "react-dom": "^17.0.1",
14 | "react-markdown": "^6.0.1",
15 | "react-redux": "^7.2.2",
16 | "react-router-dom": "^5.2.0",
17 | "react-scripts": "4.0.0",
18 | "redux": "^4.0.5",
19 | "redux-devtools-extension": "^2.13.8",
20 | "redux-thunk": "^2.3.0",
21 | "web-vitals": "^0.2.4"
22 | },
23 | "scripts": {
24 | "start": "react-scripts start",
25 | "build": "react-scripts build",
26 | "test": "react-scripts test",
27 | "eject": "react-scripts eject"
28 | },
29 | "eslintConfig": {
30 | "extends": [
31 | "react-app",
32 | "react-app/jest"
33 | ]
34 | },
35 | "browserslist": {
36 | "production": [
37 | ">0.2%",
38 | "not dead",
39 | "not op_mini all"
40 | ],
41 | "development": [
42 | "last 1 chrome version",
43 | "last 1 firefox version",
44 | "last 1 safari version"
45 | ]
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | Note Zipper
28 |
29 |
30 |
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/frontend/public/logo192.png
--------------------------------------------------------------------------------
/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/frontend/public/logo512.png
--------------------------------------------------------------------------------
/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/frontend/src/App.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/frontend/src/App.css
--------------------------------------------------------------------------------
/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import "./App.css";
2 | import { BrowserRouter as Router, Route } from "react-router-dom";
3 | import Footer from "./components/Footer";
4 | import Header from "./components/Header";
5 | import LandingPage from "./screens/LandingPage/LandingPage";
6 | import MyNotes from "./screens/MyNotes/MyNotes";
7 | import SingleNote from "./screens/SingleNote/SingleNote";
8 | import LoginScreen from "./screens/LoginScreen/LoginScreen";
9 | import RegisterScreen from "./screens/RegisterScreen/RegisterScreen";
10 | import CreateNote from "./screens/SingleNote/CreateNote";
11 | import { useState } from "react";
12 | import ProfileScreen from "./screens/ProfileScreen/ProfileScreen";
13 |
14 | function App() {
15 | const [search, setSearch] = useState("");
16 |
17 | return (
18 |
19 | setSearch(s)} />
20 |
21 |
22 |
23 |
24 | (
27 |
28 | )}
29 | />
30 |
31 | ;
32 |
33 |
34 |
35 |
36 | );
37 | }
38 |
39 | export default App;
40 |
--------------------------------------------------------------------------------
/frontend/src/actions/notesActions.js:
--------------------------------------------------------------------------------
1 | import {
2 | NOTES_CREATE_FAIL,
3 | NOTES_CREATE_REQUEST,
4 | NOTES_CREATE_SUCCESS,
5 | NOTES_DELETE_FAIL,
6 | NOTES_DELETE_REQUEST,
7 | NOTES_DELETE_SUCCESS,
8 | NOTES_LIST_FAIL,
9 | NOTES_LIST_REQUEST,
10 | NOTES_LIST_SUCCESS,
11 | NOTES_UPDATE_FAIL,
12 | NOTES_UPDATE_REQUEST,
13 | NOTES_UPDATE_SUCCESS,
14 | } from "../constants/notesConstants";
15 | import axios from "axios";
16 |
17 | export const listNotes = () => async (dispatch, getState) => {
18 | try {
19 | dispatch({
20 | type: NOTES_LIST_REQUEST,
21 | });
22 |
23 | const {
24 | userLogin: { userInfo },
25 | } = getState();
26 |
27 | const config = {
28 | headers: {
29 | Authorization: `Bearer ${userInfo.token}`,
30 | },
31 | };
32 |
33 | const { data } = await axios.get(`/api/notes`, config);
34 |
35 | dispatch({
36 | type: NOTES_LIST_SUCCESS,
37 | payload: data,
38 | });
39 | } catch (error) {
40 | const message =
41 | error.response && error.response.data.message
42 | ? error.response.data.message
43 | : error.message;
44 | dispatch({
45 | type: NOTES_LIST_FAIL,
46 | payload: message,
47 | });
48 | }
49 | };
50 |
51 | export const createNoteAction = (title, content, category) => async (
52 | dispatch,
53 | getState
54 | ) => {
55 | try {
56 | dispatch({
57 | type: NOTES_CREATE_REQUEST,
58 | });
59 |
60 | const {
61 | userLogin: { userInfo },
62 | } = getState();
63 |
64 | const config = {
65 | headers: {
66 | "Content-Type": "application/json",
67 | Authorization: `Bearer ${userInfo.token}`,
68 | },
69 | };
70 |
71 | const { data } = await axios.post(
72 | `/api/notes/create`,
73 | { title, content, category },
74 | config
75 | );
76 |
77 | dispatch({
78 | type: NOTES_CREATE_SUCCESS,
79 | payload: data,
80 | });
81 | } catch (error) {
82 | const message =
83 | error.response && error.response.data.message
84 | ? error.response.data.message
85 | : error.message;
86 | dispatch({
87 | type: NOTES_CREATE_FAIL,
88 | payload: message,
89 | });
90 | }
91 | };
92 |
93 | export const deleteNoteAction = (id) => async (dispatch, getState) => {
94 | try {
95 | dispatch({
96 | type: NOTES_DELETE_REQUEST,
97 | });
98 |
99 | const {
100 | userLogin: { userInfo },
101 | } = getState();
102 |
103 | const config = {
104 | headers: {
105 | Authorization: `Bearer ${userInfo.token}`,
106 | },
107 | };
108 |
109 | const { data } = await axios.delete(`/api/notes/${id}`, config);
110 |
111 | dispatch({
112 | type: NOTES_DELETE_SUCCESS,
113 | payload: data,
114 | });
115 | } catch (error) {
116 | const message =
117 | error.response && error.response.data.message
118 | ? error.response.data.message
119 | : error.message;
120 | dispatch({
121 | type: NOTES_DELETE_FAIL,
122 | payload: message,
123 | });
124 | }
125 | };
126 |
127 | export const updateNoteAction = (id, title, content, category) => async (
128 | dispatch,
129 | getState
130 | ) => {
131 | try {
132 | dispatch({
133 | type: NOTES_UPDATE_REQUEST,
134 | });
135 |
136 | const {
137 | userLogin: { userInfo },
138 | } = getState();
139 |
140 | const config = {
141 | headers: {
142 | "Content-Type": "application/json",
143 | Authorization: `Bearer ${userInfo.token}`,
144 | },
145 | };
146 |
147 | const { data } = await axios.put(
148 | `/api/notes/${id}`,
149 | { title, content, category },
150 | config
151 | );
152 |
153 | dispatch({
154 | type: NOTES_UPDATE_SUCCESS,
155 | payload: data,
156 | });
157 | } catch (error) {
158 | const message =
159 | error.response && error.response.data.message
160 | ? error.response.data.message
161 | : error.message;
162 | dispatch({
163 | type: NOTES_UPDATE_FAIL,
164 | payload: message,
165 | });
166 | }
167 | };
168 |
--------------------------------------------------------------------------------
/frontend/src/actions/userActions.js:
--------------------------------------------------------------------------------
1 | import {
2 | USER_LOGIN_FAIL,
3 | USER_LOGIN_REQUEST,
4 | USER_LOGIN_SUCCESS,
5 | USER_LOGOUT,
6 | USER_REGISTER_FAIL,
7 | USER_REGISTER_REQUEST,
8 | USER_REGISTER_SUCCESS,
9 | USER_UPDATE_FAIL,
10 | USER_UPDATE_REQUEST,
11 | USER_UPDATE_SUCCESS,
12 | } from "../constants/userConstants";
13 | import axios from "axios";
14 |
15 | export const login = (email, password) => async (dispatch) => {
16 | try {
17 | dispatch({ type: USER_LOGIN_REQUEST });
18 |
19 | const config = {
20 | headers: {
21 | "Content-type": "application/json",
22 | },
23 | };
24 |
25 | const { data } = await axios.post(
26 | "/api/users/login",
27 | { email, password },
28 | config
29 | );
30 |
31 | dispatch({ type: USER_LOGIN_SUCCESS, payload: data });
32 |
33 | localStorage.setItem("userInfo", JSON.stringify(data));
34 | } catch (error) {
35 | dispatch({
36 | type: USER_LOGIN_FAIL,
37 | payload:
38 | error.response && error.response.data.message
39 | ? error.response.data.message
40 | : error.message,
41 | });
42 | }
43 | };
44 |
45 | export const logout = () => async (dispatch) => {
46 | localStorage.removeItem("userInfo");
47 | dispatch({ type: USER_LOGOUT });
48 | };
49 |
50 | export const register = (name, email, password, pic) => async (dispatch) => {
51 | try {
52 | dispatch({ type: USER_REGISTER_REQUEST });
53 |
54 | const config = {
55 | headers: {
56 | "Content-type": "application/json",
57 | },
58 | };
59 |
60 | const { data } = await axios.post(
61 | "/api/users",
62 | { name, pic, email, password },
63 | config
64 | );
65 |
66 | dispatch({ type: USER_REGISTER_SUCCESS, payload: data });
67 |
68 | dispatch({ type: USER_LOGIN_SUCCESS, payload: data });
69 |
70 | localStorage.setItem("userInfo", JSON.stringify(data));
71 | } catch (error) {
72 | dispatch({
73 | type: USER_REGISTER_FAIL,
74 | payload:
75 | error.response && error.response.data.message
76 | ? error.response.data.message
77 | : error.message,
78 | });
79 | }
80 | };
81 |
82 | export const updateProfile = (user) => async (dispatch, getState) => {
83 | try {
84 | dispatch({ type: USER_UPDATE_REQUEST });
85 |
86 | const {
87 | userLogin: { userInfo },
88 | } = getState();
89 |
90 | const config = {
91 | headers: {
92 | "Content-Type": "application/json",
93 | Authorization: `Bearer ${userInfo.token}`,
94 | },
95 | };
96 |
97 | const { data } = await axios.post("/api/users/profile", user, config);
98 |
99 | dispatch({ type: USER_UPDATE_SUCCESS, payload: data });
100 |
101 | dispatch({ type: USER_LOGIN_SUCCESS, payload: data });
102 |
103 | localStorage.setItem("userInfo", JSON.stringify(data));
104 | } catch (error) {
105 | dispatch({
106 | type: USER_UPDATE_FAIL,
107 | payload:
108 | error.response && error.response.data.message
109 | ? error.response.data.message
110 | : error.message,
111 | });
112 | }
113 | };
114 |
--------------------------------------------------------------------------------
/frontend/src/background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/frontend/src/background.jpg
--------------------------------------------------------------------------------
/frontend/src/background.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/frontend/src/background.webp
--------------------------------------------------------------------------------
/frontend/src/background1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/frontend/src/background1.jpg
--------------------------------------------------------------------------------
/frontend/src/components/ErrorMessage.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Alert } from "react-bootstrap";
3 |
4 | const ErrorMessage = ({ variant = "info", children }) => {
5 | return (
6 |
7 | {children}
8 |
9 | );
10 | };
11 |
12 | export default ErrorMessage;
13 |
--------------------------------------------------------------------------------
/frontend/src/components/Footer.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Col, Container, Row } from "react-bootstrap";
3 |
4 | const Footer = () => {
5 | return (
6 |
21 | );
22 | };
23 |
24 | export default Footer;
25 |
--------------------------------------------------------------------------------
/frontend/src/components/Header.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from "react";
2 | import {
3 | Container,
4 | Form,
5 | FormControl,
6 | Nav,
7 | Navbar,
8 | NavDropdown,
9 | } from "react-bootstrap";
10 | import { useDispatch, useSelector } from "react-redux";
11 | import {} from "react-router-dom";
12 | import { logout } from "../actions/userActions";
13 |
14 | function Header({ setSearch }) {
15 | const dispatch = useDispatch();
16 |
17 | const userLogin = useSelector((state) => state.userLogin);
18 | const { userInfo } = userLogin;
19 |
20 | const logoutHandler = () => {
21 | dispatch(logout());
22 | };
23 |
24 | useEffect(() => {}, [userInfo]);
25 |
26 | return (
27 |
28 |
29 | Note Zipper
30 |
31 |
32 |
33 |
45 |
74 |
75 |
76 |
77 | );
78 | }
79 |
80 | export default Header;
81 |
--------------------------------------------------------------------------------
/frontend/src/components/Loading.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Spinner } from "react-bootstrap";
3 |
4 | function Loading({ size = 100 }) {
5 | return (
6 |
15 |
22 |
23 | );
24 | }
25 |
26 | export default Loading;
27 |
--------------------------------------------------------------------------------
/frontend/src/components/MainScreen.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Container, Row } from "react-bootstrap";
3 | import "./Screen.css";
4 |
5 | function MainScreen({ children, title }) {
6 | return (
7 |
8 |
9 |
10 |
11 | {title && (
12 | <>
13 |
{title}
14 |
15 | >
16 | )}
17 | {children}
18 |
19 |
20 |
21 |
22 | );
23 | }
24 |
25 | export default MainScreen;
26 |
--------------------------------------------------------------------------------
/frontend/src/components/Screen.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=Work+Sans:wght@200&display=swap");
2 |
3 | .mainback {
4 | min-height: 93vh;
5 | display: flex;
6 | padding: 10px 0;
7 | }
8 | .page {
9 | width: 100%;
10 | }
11 | .heading {
12 | font-size: 60px;
13 | /* font-family: "Ubuntu", sans-serif; */
14 | font-family: "Work Sans", sans-serif;
15 | padding: 5px 10px;
16 | }
17 |
18 | @media only screen and (min-width: 1200px) {
19 | }
20 |
21 | @media only screen and (max-width: 600px) {
22 | .heading {
23 | font-size: 30px;
24 | display: flex;
25 | justify-content: center;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/frontend/src/constants/notesConstants.js:
--------------------------------------------------------------------------------
1 | export const NOTES_LIST_REQUEST = "NOTES_LIST_REQUEST";
2 | export const NOTES_LIST_SUCCESS = "NOTES_LIST_SUCCESS";
3 | export const NOTES_LIST_FAIL = "NOTES_LIST_FAIL";
4 |
5 | export const NOTES_CREATE_REQUEST = "NOTES_CREATE_REQUEST";
6 | export const NOTES_CREATE_SUCCESS = "NOTES_CREATE_SUCCESS";
7 | export const NOTES_CREATE_FAIL = "NOTES_CREATE_FAIL";
8 |
9 | export const NOTES_UPDATE_REQUEST = "NOTES_UPDATE_REQUEST";
10 | export const NOTES_UPDATE_SUCCESS = "NOTES_UPDATE_SUCCESS";
11 | export const NOTES_UPDATE_FAIL = "NOTES_UPDATE_FAIL";
12 |
13 | export const NOTES_DELETE_REQUEST = "NOTES_DELETE_REQUEST";
14 | export const NOTES_DELETE_SUCCESS = "NOTES_DELETE_SUCCESS";
15 | export const NOTES_DELETE_FAIL = "NOTES_DELETE_FAIL";
16 |
--------------------------------------------------------------------------------
/frontend/src/constants/userConstants.js:
--------------------------------------------------------------------------------
1 | export const USER_LOGIN_REQUEST = "USER_LOGIN_REQUEST";
2 | export const USER_LOGIN_SUCCESS = "USER_LOGIN_SUCCESS";
3 | export const USER_LOGIN_FAIL = "USER_LOGIN_FAIL";
4 | export const USER_LOGOUT = "USER_LOGOUT";
5 |
6 | export const USER_REGISTER_REQUEST = "USER_REGISTER_REQUEST";
7 | export const USER_REGISTER_SUCCESS = "USER_REGISTER_SUCCESS";
8 | export const USER_REGISTER_FAIL = "USER_REGISTER_FAIL";
9 |
10 | export const USER_UPDATE_REQUEST = "USER_UPDATE_REQUEST";
11 | export const USER_UPDATE_SUCCESS = "USER_UPDATE_SUCCESS";
12 | export const USER_UPDATE_FAIL = "USER_UPDATE_FAIL";
13 |
--------------------------------------------------------------------------------
/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=Work+Sans:wght@200&display=swap");
2 |
3 | body {
4 | margin: 0;
5 | font-family: -apple-system, BlinkMacSystemFont, "Work Sans", "Segoe UI",
6 | "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans",
7 | "Helvetica Neue", sans-serif;
8 | -webkit-font-smoothing: antialiased;
9 | -moz-osx-font-smoothing: grayscale;
10 | }
11 |
12 | code {
13 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
14 | monospace;
15 | }
16 |
--------------------------------------------------------------------------------
/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import "./index.css";
4 | import "./bootstrap.min.css";
5 | import App from "./App";
6 | import reportWebVitals from "./reportWebVitals";
7 | import { Provider } from "react-redux";
8 | import store from "./store";
9 |
10 | ReactDOM.render(
11 |
12 |
13 | ,
14 | document.getElementById("root")
15 | );
16 |
17 | // If you want to start measuring performance in your app, pass a function
18 | // to log results (for example: reportWebVitals(console.log))
19 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
20 | reportWebVitals();
21 |
--------------------------------------------------------------------------------
/frontend/src/reducers/notesReducers.js:
--------------------------------------------------------------------------------
1 | import {
2 | NOTES_UPDATE_REQUEST,
3 | NOTES_UPDATE_SUCCESS,
4 | NOTES_UPDATE_FAIL,
5 | NOTES_CREATE_FAIL,
6 | NOTES_CREATE_REQUEST,
7 | NOTES_CREATE_SUCCESS,
8 | NOTES_DELETE_FAIL,
9 | NOTES_DELETE_REQUEST,
10 | NOTES_DELETE_SUCCESS,
11 | NOTES_LIST_FAIL,
12 | NOTES_LIST_REQUEST,
13 | NOTES_LIST_SUCCESS,
14 | } from "../constants/notesConstants";
15 |
16 | export const noteListReducer = (state = { notes: [] }, action) => {
17 | switch (action.type) {
18 | case NOTES_LIST_REQUEST:
19 | return { loading: true };
20 | case NOTES_LIST_SUCCESS:
21 | return { loading: false, notes: action.payload };
22 | case NOTES_LIST_FAIL:
23 | return { loading: false, error: action.payload };
24 |
25 | default:
26 | return state;
27 | }
28 | };
29 |
30 | export const noteCreateReducer = (state = {}, action) => {
31 | switch (action.type) {
32 | case NOTES_CREATE_REQUEST:
33 | return { loading: true };
34 | case NOTES_CREATE_SUCCESS:
35 | return { loading: false, success: true };
36 | case NOTES_CREATE_FAIL:
37 | return { loading: false, error: action.payload };
38 |
39 | default:
40 | return state;
41 | }
42 | };
43 |
44 | export const noteDeleteReducer = (state = {}, action) => {
45 | switch (action.type) {
46 | case NOTES_DELETE_REQUEST:
47 | return { loading: true };
48 | case NOTES_DELETE_SUCCESS:
49 | return { loading: false, success: true };
50 | case NOTES_DELETE_FAIL:
51 | return { loading: false, error: action.payload, success: false };
52 |
53 | default:
54 | return state;
55 | }
56 | };
57 |
58 | export const noteUpdateReducer = (state = {}, action) => {
59 | switch (action.type) {
60 | case NOTES_UPDATE_REQUEST:
61 | return { loading: true };
62 | case NOTES_UPDATE_SUCCESS:
63 | return { loading: false, success: true };
64 | case NOTES_UPDATE_FAIL:
65 | return { loading: false, error: action.payload, success: false };
66 |
67 | default:
68 | return state;
69 | }
70 | };
71 |
--------------------------------------------------------------------------------
/frontend/src/reducers/userReducers.js:
--------------------------------------------------------------------------------
1 | import {
2 | USER_LOGIN_FAIL,
3 | USER_LOGIN_REQUEST,
4 | USER_LOGIN_SUCCESS,
5 | USER_LOGOUT,
6 | USER_REGISTER_FAIL,
7 | USER_REGISTER_REQUEST,
8 | USER_REGISTER_SUCCESS,
9 | USER_UPDATE_FAIL,
10 | USER_UPDATE_REQUEST,
11 | USER_UPDATE_SUCCESS,
12 | } from "../constants/userConstants";
13 |
14 | export const userLoginReducer = (state = {}, action) => {
15 | switch (action.type) {
16 | case USER_LOGIN_REQUEST:
17 | return { loading: true };
18 | case USER_LOGIN_SUCCESS:
19 | return { loading: false, userInfo: action.payload };
20 | case USER_LOGIN_FAIL:
21 | return { loading: false, error: action.payload };
22 | case USER_LOGOUT:
23 | return {};
24 | default:
25 | return state;
26 | }
27 | };
28 |
29 | export const userRegisterReducer = (state = {}, action) => {
30 | switch (action.type) {
31 | case USER_REGISTER_REQUEST:
32 | return { loading: true };
33 | case USER_REGISTER_SUCCESS:
34 | return { loading: false, userInfo: action.payload };
35 | case USER_REGISTER_FAIL:
36 | return { loading: false, error: action.payload };
37 | default:
38 | return state;
39 | }
40 | };
41 |
42 | export const userUpdateReducer = (state = {}, action) => {
43 | switch (action.type) {
44 | case USER_UPDATE_REQUEST:
45 | return { loading: true };
46 | case USER_UPDATE_SUCCESS:
47 | return { loading: false, userInfo: action.payload, success: true };
48 | case USER_UPDATE_FAIL:
49 | return { loading: false, error: action.payload, success: false };
50 | default:
51 | return state;
52 | }
53 | };
54 |
--------------------------------------------------------------------------------
/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/frontend/src/screens/LandingPage/LandingPage.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from "react";
2 | import { Button, Container, Row } from "react-bootstrap";
3 | import { useSelector } from "react-redux";
4 | import { Link } from "react-router-dom";
5 | import "./LandingStyles.css";
6 |
7 | function LandingPage({ history }) {
8 | const userLogin = useSelector((state) => state.userLogin);
9 | const { userInfo } = userLogin;
10 |
11 | useEffect(() => {
12 | if (userInfo) {
13 | history.push("/mynotes");
14 | }
15 | }, [history, userInfo]);
16 |
17 | return (
18 |
19 |
20 |
21 |
22 |
23 |
Welcome to Note Zipper
24 |
One Safe place for all your notes.
25 |
26 |
27 |
28 |
31 |
32 |
33 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | );
47 | }
48 |
49 | export default LandingPage;
50 |
--------------------------------------------------------------------------------
/frontend/src/screens/LandingPage/LandingStyles.css:
--------------------------------------------------------------------------------
1 | .title {
2 | font-size: 95px;
3 | }
4 | .subtitle {
5 | font-size: 25px;
6 | padding-top: 10px;
7 | }
8 | .intro-text {
9 | width: 100%;
10 | text-align: center;
11 | }
12 | .main {
13 | min-height: 93vh;
14 | display: flex;
15 | align-items: center;
16 | background-image: url("../../background1.jpg");
17 | background-position: center;
18 | background-size: cover;
19 | }
20 | .buttonContainer {
21 | margin-top: 50px;
22 | display: flex;
23 | justify-content: space-evenly;
24 | }
25 |
26 | .landingbutton {
27 | width: 200px;
28 | height: 55px;
29 | }
30 |
31 | @media only screen and (min-width: 1200px) {
32 | .buttonContainer {
33 | padding: 0 200px;
34 | }
35 | .title {
36 | padding: 0 100px;
37 | }
38 | }
39 |
40 | @media only screen and (max-width: 768px) {
41 | .title {
42 | font-size: 60px;
43 | }
44 | .landingbutton {
45 | width: 150px;
46 | height: 50px;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/frontend/src/screens/LoginScreen/LoginScreen.css:
--------------------------------------------------------------------------------
1 | .loginContainer {
2 | display: flex;
3 | flex-direction: column;
4 | margin: 20px;
5 | }
6 |
--------------------------------------------------------------------------------
/frontend/src/screens/LoginScreen/LoginScreen.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { Form, Button, Row, Col } from "react-bootstrap";
3 | import { useDispatch, useSelector } from "react-redux";
4 | import { Link } from "react-router-dom";
5 | import Loading from "../../components/Loading";
6 | import ErrorMessage from "../../components/ErrorMessage";
7 | import { login } from "../../actions/userActions";
8 | import MainScreen from "../../components/MainScreen";
9 | import "./LoginScreen.css";
10 |
11 | function LoginScreen({ history }) {
12 | const [email, setEmail] = useState("");
13 | const [password, setPassword] = useState("");
14 |
15 | const dispatch = useDispatch();
16 |
17 | const userLogin = useSelector((state) => state.userLogin);
18 | const { loading, error, userInfo } = userLogin;
19 |
20 | useEffect(() => {
21 | if (userInfo) {
22 | history.push("/mynotes");
23 | }
24 | }, [history, userInfo]);
25 |
26 | const submitHandler = (e) => {
27 | e.preventDefault();
28 | dispatch(login(email, password));
29 | };
30 |
31 | return (
32 |
33 |
34 | {error && {error}}
35 | {loading && }
36 |
38 | Email address
39 | setEmail(e.target.value)}
44 | />
45 |
46 |
47 |
48 | Password
49 | setPassword(e.target.value)}
54 | />
55 |
56 |
57 |
60 |
61 |
62 |
63 | New Customer ? Register Here
64 |
65 |
66 |
67 |
68 | );
69 | }
70 |
71 | export default LoginScreen;
72 |
--------------------------------------------------------------------------------
/frontend/src/screens/MyNotes/MyNotes.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from "react";
2 | import { Accordion, Badge, Button, Card } from "react-bootstrap";
3 | import MainScreen from "../../components/MainScreen";
4 | import { Link } from "react-router-dom";
5 | import ReactMarkdown from "react-markdown";
6 |
7 | import { useDispatch, useSelector } from "react-redux";
8 | import { deleteNoteAction, listNotes } from "../../actions/notesActions";
9 | import Loading from "../../components/Loading";
10 | import ErrorMessage from "../../components/ErrorMessage";
11 |
12 | function MyNotes({ history, search }) {
13 | const dispatch = useDispatch();
14 |
15 | const noteList = useSelector((state) => state.noteList);
16 | const { loading, error, notes } = noteList;
17 |
18 | // const filteredNotes = notes.filter((note) =>
19 | // note.title.toLowerCase().includes(search.toLowerCase())
20 | // );
21 |
22 | const userLogin = useSelector((state) => state.userLogin);
23 | const { userInfo } = userLogin;
24 |
25 | const noteDelete = useSelector((state) => state.noteDelete);
26 | const {
27 | loading: loadingDelete,
28 | error: errorDelete,
29 | success: successDelete,
30 | } = noteDelete;
31 |
32 | const noteCreate = useSelector((state) => state.noteCreate);
33 | const { success: successCreate } = noteCreate;
34 |
35 | const noteUpdate = useSelector((state) => state.noteUpdate);
36 | const { success: successUpdate } = noteUpdate;
37 |
38 | useEffect(() => {
39 | dispatch(listNotes());
40 | if (!userInfo) {
41 | history.push("/");
42 | }
43 | }, [
44 | dispatch,
45 | history,
46 | userInfo,
47 | successDelete,
48 | successCreate,
49 | successUpdate,
50 | ]);
51 |
52 | const deleteHandler = (id) => {
53 | if (window.confirm("Are you sure?")) {
54 | dispatch(deleteNoteAction(id));
55 | }
56 | };
57 |
58 | return (
59 |
60 | {console.log(notes)}
61 |
62 |
65 |
66 | {error && {error}}
67 | {errorDelete && (
68 | {errorDelete}
69 | )}
70 | {loading && }
71 | {loadingDelete && }
72 | {notes &&
73 | notes
74 | .filter((filteredNote) =>
75 | filteredNote.title.toLowerCase().includes(search.toLowerCase())
76 | )
77 | .reverse()
78 | .map((note) => (
79 |
80 |
81 |
82 | ModelShow(note)}
84 | style={{
85 | color: "black",
86 | textDecoration: "none",
87 | flex: 1,
88 | cursor: "pointer",
89 | alignSelf: "center",
90 | fontSize: 18,
91 | }}
92 | >
93 |
98 | {note.title}
99 |
100 |
101 |
102 |
103 |
104 |
111 |
112 |
113 |
114 |
115 |
116 |
117 | Category - {note.category}
118 |
119 |
120 |
121 | {note.content}
122 |
128 |
129 |
130 |
131 |
132 |
133 | ))}
134 |
135 | );
136 | }
137 |
138 | export default MyNotes;
139 |
--------------------------------------------------------------------------------
/frontend/src/screens/ProfileScreen/ProfileScreen.css:
--------------------------------------------------------------------------------
1 | .profilePic {
2 | width: 60%;
3 | display: flex;
4 | align-items: center;
5 | padding: 20px;
6 | }
7 | .profileContainer {
8 | display: flex;
9 | margin: 20px;
10 | }
11 | @media only screen and (max-width: 768px) {
12 | .profileContainer {
13 | flex-direction: column-reverse;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/frontend/src/screens/ProfileScreen/ProfileScreen.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { Form, Button, Row, Col } from "react-bootstrap";
3 | import MainScreen from "../../components/MainScreen";
4 | import "./ProfileScreen.css";
5 | import { useDispatch, useSelector } from "react-redux";
6 | import { updateProfile } from "../../actions/userActions";
7 | import Loading from "../../components/Loading";
8 | import ErrorMessage from "../../components/ErrorMessage";
9 |
10 | const ProfileScreen = ({ location, history }) => {
11 | const [name, setName] = useState("");
12 | const [email, setEmail] = useState("");
13 | const [pic, setPic] = useState();
14 | const [password, setPassword] = useState("");
15 | const [confirmPassword, setConfirmPassword] = useState("");
16 | const [picMessage, setPicMessage] = useState();
17 |
18 | const dispatch = useDispatch();
19 |
20 | const userLogin = useSelector((state) => state.userLogin);
21 | const { userInfo } = userLogin;
22 |
23 | const userUpdate = useSelector((state) => state.userUpdate);
24 | const { loading, error, success } = userUpdate;
25 |
26 | useEffect(() => {
27 | if (!userInfo) {
28 | history.push("/");
29 | } else {
30 | setName(userInfo.name);
31 | setEmail(userInfo.email);
32 | setPic(userInfo.pic);
33 | }
34 | }, [history, userInfo]);
35 |
36 | const postDetails = (pics) => {
37 | setPicMessage(null);
38 | if (pics.type === "image/jpeg" || pics.type === "image/png") {
39 | const data = new FormData();
40 | data.append("file", pics);
41 | data.append("upload_preset", "notezipper");
42 | data.append("cloud_name", "piyushproj");
43 | fetch("https://api.cloudinary.com/v1_1/piyushproj/image/upload", {
44 | method: "post",
45 | body: data,
46 | })
47 | .then((res) => res.json())
48 | .then((data) => {
49 | setPic(data.url.toString());
50 | console.log(pic);
51 | })
52 | .catch((err) => {
53 | console.log(err);
54 | });
55 | } else {
56 | return setPicMessage("Please Select an Image");
57 | }
58 | };
59 |
60 | const submitHandler = (e) => {
61 | e.preventDefault();
62 |
63 | dispatch(updateProfile({ name, email, password, pic }));
64 | };
65 |
66 | return (
67 |
68 |
69 |
70 |
71 |
80 | Name
81 | setName(e.target.value)}
86 | >
87 |
88 |
89 | Email Address
90 | setEmail(e.target.value)}
95 | >
96 |
97 |
98 | Password
99 | setPassword(e.target.value)}
104 | >
105 |
106 |
107 | Confirm Password
108 | setConfirmPassword(e.target.value)}
113 | >
114 | {" "}
115 | {picMessage && (
116 | {picMessage}
117 | )}
118 |
119 | Change Profile Picture
120 | postDetails(e.target.files[0])}
122 | id="custom-file"
123 | type="image/png"
124 | label="Upload Profile Picture"
125 | custom
126 | />
127 |
128 |
131 |
132 |
133 |
140 |
141 |
142 |
143 |
144 |
145 | );
146 | };
147 |
148 | export default ProfileScreen;
149 |
--------------------------------------------------------------------------------
/frontend/src/screens/RegisterScreen/RegisterScreen.css:
--------------------------------------------------------------------------------
1 | .loginContainer {
2 | display: flex;
3 | flex-direction: column;
4 | margin: 20px;
5 | }
6 |
--------------------------------------------------------------------------------
/frontend/src/screens/RegisterScreen/RegisterScreen.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { Form, Button, Row, Col } from "react-bootstrap";
3 | import { useDispatch, useSelector } from "react-redux";
4 | import { Link } from "react-router-dom";
5 | import Loading from "../../components/Loading";
6 | import ErrorMessage from "../../components/ErrorMessage";
7 | import { register } from "../../actions/userActions";
8 | import MainScreen from "../../components/MainScreen";
9 | import "./RegisterScreen.css";
10 |
11 | function RegisterScreen({ history }) {
12 | const [email, setEmail] = useState("");
13 | const [name, setName] = useState("");
14 | const [pic, setPic] = useState(
15 | "https://icon-library.com/images/anonymous-avatar-icon/anonymous-avatar-icon-25.jpg"
16 | );
17 | const [password, setPassword] = useState("");
18 | const [confirmpassword, setConfirmPassword] = useState("");
19 | const [message, setMessage] = useState(null);
20 | const [picMessage, setPicMessage] = useState(null);
21 |
22 | const dispatch = useDispatch();
23 |
24 | const userRegister = useSelector((state) => state.userRegister);
25 | const { loading, error, userInfo } = userRegister;
26 |
27 | const postDetails = (pics) => {
28 | if (
29 | pics ===
30 | "https://icon-library.com/images/anonymous-avatar-icon/anonymous-avatar-icon-25.jpg"
31 | ) {
32 | return setPicMessage("Please Select an Image");
33 | }
34 | setPicMessage(null);
35 | if (pics.type === "image/jpeg" || pics.type === "image/png") {
36 | const data = new FormData();
37 | data.append("file", pics);
38 | data.append("upload_preset", "notezipper");
39 | data.append("cloud_name", "piyushproj");
40 | fetch("https://api.cloudinary.com/v1_1/piyushproj/image/upload", {
41 | method: "post",
42 | body: data,
43 | })
44 | .then((res) => res.json())
45 | .then((data) => {
46 | setPic(data.url.toString());
47 | })
48 | .catch((err) => {
49 | console.log(err);
50 | });
51 | } else {
52 | return setPicMessage("Please Select an Image");
53 | }
54 | };
55 |
56 | useEffect(() => {
57 | if (userInfo) {
58 | history.push("/");
59 | }
60 | }, [history, userInfo]);
61 |
62 | const submitHandler = (e) => {
63 | e.preventDefault();
64 |
65 | if (password !== confirmpassword) {
66 | setMessage("Passwords do not match");
67 | } else dispatch(register(name, email, password, pic));
68 | };
69 |
70 | return (
71 |
72 |
73 | {error && {error}}
74 | {message && {message}}
75 | {loading && }
76 |
78 | Name
79 | setName(e.target.value)}
84 | />
85 |
86 |
87 |
88 | Email address
89 | setEmail(e.target.value)}
94 | />
95 |
96 |
97 |
98 | Password
99 | setPassword(e.target.value)}
104 | />
105 |
106 |
107 |
108 | Confirm Password
109 | setConfirmPassword(e.target.value)}
114 | />
115 |
116 |
117 | {picMessage && (
118 | {picMessage}
119 | )}
120 |
121 | Profile Picture
122 | postDetails(e.target.files[0])}
124 | id="custom-file"
125 | type="image/png"
126 | label="Upload Profile Picture"
127 | custom
128 | />
129 |
130 |
131 |
134 |
135 |
136 |
137 | Have an Account ? Login
138 |
139 |
140 |
141 |
142 | );
143 | }
144 |
145 | export default RegisterScreen;
146 |
--------------------------------------------------------------------------------
/frontend/src/screens/SingleNote/CreateNote.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import MainScreen from "../../components/MainScreen";
3 | import { Button, Card, Form } from "react-bootstrap";
4 | import { useDispatch, useSelector } from "react-redux";
5 | import { createNoteAction } from "../../actions/notesActions";
6 | import Loading from "../../components/Loading";
7 | import ErrorMessage from "../../components/ErrorMessage";
8 | import ReactMarkdown from "react-markdown";
9 |
10 | function CreateNote({ history }) {
11 | const [title, setTitle] = useState("");
12 | const [content, setContent] = useState("");
13 | const [category, setCategory] = useState("");
14 |
15 | const dispatch = useDispatch();
16 |
17 | const noteCreate = useSelector((state) => state.noteCreate);
18 | const { loading, error, note } = noteCreate;
19 |
20 | console.log(note);
21 |
22 | const resetHandler = () => {
23 | setTitle("");
24 | setCategory("");
25 | setContent("");
26 | };
27 |
28 | const submitHandler = (e) => {
29 | e.preventDefault();
30 | dispatch(createNoteAction(title, content, category));
31 | if (!title || !content || !category) return;
32 |
33 | resetHandler();
34 | history.push("/mynotes");
35 | };
36 |
37 | useEffect(() => {}, []);
38 |
39 | return (
40 |
41 |
42 | Create a new Note
43 |
44 |
47 | Title
48 | setTitle(e.target.value)}
53 | />
54 |
55 |
56 |
57 | Content
58 | setContent(e.target.value)}
64 | />
65 |
66 | {content && (
67 |
68 | Note Preview
69 |
70 | {content}
71 |
72 |
73 | )}
74 |
75 |
76 | Category
77 | setCategory(e.target.value)}
82 | />
83 |
84 | {loading && }
85 |
88 |
91 |
92 |
93 |
94 |
95 | Creating on - {new Date().toLocaleDateString()}
96 |
97 |
98 |
99 | );
100 | }
101 |
102 | export default CreateNote;
103 |
--------------------------------------------------------------------------------
/frontend/src/screens/SingleNote/SingleNote.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import MainScreen from "../../components/MainScreen";
3 | import axios from "axios";
4 | import { Button, Card, Form } from "react-bootstrap";
5 | import { useDispatch, useSelector } from "react-redux";
6 | import { deleteNoteAction, updateNoteAction } from "../../actions/notesActions";
7 | import ErrorMessage from "../../components/ErrorMessage";
8 | import Loading from "../../components/Loading";
9 | import ReactMarkdown from "react-markdown";
10 |
11 | function SingleNote({ match, history }) {
12 | const [title, setTitle] = useState();
13 | const [content, setContent] = useState();
14 | const [category, setCategory] = useState();
15 | const [date, setDate] = useState("");
16 |
17 | const dispatch = useDispatch();
18 |
19 | const noteUpdate = useSelector((state) => state.noteUpdate);
20 | const { loading, error } = noteUpdate;
21 |
22 | const noteDelete = useSelector((state) => state.noteDelete);
23 | const { loading: loadingDelete, error: errorDelete } = noteDelete;
24 |
25 | const deleteHandler = (id) => {
26 | if (window.confirm("Are you sure?")) {
27 | dispatch(deleteNoteAction(id));
28 | }
29 | history.push("/mynotes");
30 | };
31 |
32 | useEffect(() => {
33 | const fetching = async () => {
34 | const { data } = await axios.get(`/api/notes/${match.params.id}`);
35 |
36 | setTitle(data.title);
37 | setContent(data.content);
38 | setCategory(data.category);
39 | setDate(data.updatedAt);
40 | };
41 |
42 | fetching();
43 | }, [match.params.id, date]);
44 |
45 | const resetHandler = () => {
46 | setTitle("");
47 | setCategory("");
48 | setContent("");
49 | };
50 |
51 | const updateHandler = (e) => {
52 | e.preventDefault();
53 | dispatch(updateNoteAction(match.params.id, title, content, category));
54 | if (!title || !content || !category) return;
55 |
56 | resetHandler();
57 | history.push("/mynotes");
58 | };
59 |
60 | return (
61 |
62 |
63 | Edit your Note
64 |
65 |
72 | Title
73 | setTitle(e.target.value)}
78 | />
79 |
80 |
81 |
82 | Content
83 | setContent(e.target.value)}
89 | />
90 |
91 | {content && (
92 |
93 | Note Preview
94 |
95 | {content}
96 |
97 |
98 | )}
99 |
100 |
101 | Category
102 | setCategory(e.target.value)}
107 | />
108 |
109 | {loading && }
110 |
113 |
120 |
121 |
122 |
123 |
124 | Updated on - {date.substring(0, 10)}
125 |
126 |
127 |
128 | );
129 | }
130 |
131 | export default SingleNote;
132 |
--------------------------------------------------------------------------------
/frontend/src/store.js:
--------------------------------------------------------------------------------
1 | import { createStore, combineReducers, applyMiddleware } from "redux";
2 | import thunk from "redux-thunk";
3 | import { composeWithDevTools } from "redux-devtools-extension";
4 | import {
5 | noteCreateReducer,
6 | noteDeleteReducer,
7 | noteListReducer,
8 | noteUpdateReducer,
9 | } from "./reducers/notesReducers";
10 | import {
11 | userLoginReducer,
12 | userRegisterReducer,
13 | userUpdateReducer,
14 | } from "./reducers/userReducers";
15 |
16 | const reducer = combineReducers({
17 | noteList: noteListReducer,
18 | userLogin: userLoginReducer,
19 | userRegister: userRegisterReducer,
20 | noteCreate: noteCreateReducer,
21 | noteDelete: noteDeleteReducer,
22 | noteUpdate: noteUpdateReducer,
23 | userUpdate: userUpdateReducer,
24 | });
25 |
26 | const userInfoFromStorage = localStorage.getItem("userInfo")
27 | ? JSON.parse(localStorage.getItem("userInfo"))
28 | : null;
29 |
30 | const initialState = {
31 | userLogin: { userInfo: userInfoFromStorage },
32 | };
33 |
34 | const middleware = [thunk];
35 |
36 | const store = createStore(
37 | reducer,
38 | initialState,
39 | composeWithDevTools(applyMiddleware(...middleware))
40 | );
41 |
42 | export default store;
43 |
--------------------------------------------------------------------------------
/images/allnotes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/images/allnotes.png
--------------------------------------------------------------------------------
/images/create.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/images/create.png
--------------------------------------------------------------------------------
/images/edit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/images/edit.png
--------------------------------------------------------------------------------
/images/landing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/images/landing.png
--------------------------------------------------------------------------------
/images/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/images/login.png
--------------------------------------------------------------------------------
/images/profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piyush-eon/notezipper/02c46832a574d652c3f4a5166a291d704085e504/images/profile.png
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "notezipper",
3 | "version": "1.0.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 | "abbrev": {
23 | "version": "1.1.1",
24 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
25 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
26 | "dev": true
27 | },
28 | "accepts": {
29 | "version": "1.3.7",
30 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
31 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
32 | "requires": {
33 | "mime-types": "~2.1.24",
34 | "negotiator": "0.6.2"
35 | }
36 | },
37 | "ansi-align": {
38 | "version": "3.0.0",
39 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
40 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
41 | "dev": true,
42 | "requires": {
43 | "string-width": "^3.0.0"
44 | }
45 | },
46 | "ansi-regex": {
47 | "version": "4.1.0",
48 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
49 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
50 | "dev": true
51 | },
52 | "ansi-styles": {
53 | "version": "3.2.1",
54 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
55 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
56 | "dev": true,
57 | "requires": {
58 | "color-convert": "^1.9.0"
59 | }
60 | },
61 | "anymatch": {
62 | "version": "3.1.1",
63 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
64 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
65 | "dev": true,
66 | "requires": {
67 | "normalize-path": "^3.0.0",
68 | "picomatch": "^2.0.4"
69 | }
70 | },
71 | "array-flatten": {
72 | "version": "1.1.1",
73 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
74 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
75 | },
76 | "balanced-match": {
77 | "version": "1.0.0",
78 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
79 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
80 | "dev": true
81 | },
82 | "bcryptjs": {
83 | "version": "2.4.3",
84 | "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
85 | "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
86 | },
87 | "binary-extensions": {
88 | "version": "2.1.0",
89 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
90 | "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
91 | "dev": true
92 | },
93 | "bl": {
94 | "version": "2.2.1",
95 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
96 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
97 | "requires": {
98 | "readable-stream": "^2.3.5",
99 | "safe-buffer": "^5.1.1"
100 | }
101 | },
102 | "bluebird": {
103 | "version": "3.5.1",
104 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
105 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
106 | },
107 | "body-parser": {
108 | "version": "1.19.0",
109 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
110 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
111 | "requires": {
112 | "bytes": "3.1.0",
113 | "content-type": "~1.0.4",
114 | "debug": "2.6.9",
115 | "depd": "~1.1.2",
116 | "http-errors": "1.7.2",
117 | "iconv-lite": "0.4.24",
118 | "on-finished": "~2.3.0",
119 | "qs": "6.7.0",
120 | "raw-body": "2.4.0",
121 | "type-is": "~1.6.17"
122 | }
123 | },
124 | "boxen": {
125 | "version": "4.2.0",
126 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
127 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
128 | "dev": true,
129 | "requires": {
130 | "ansi-align": "^3.0.0",
131 | "camelcase": "^5.3.1",
132 | "chalk": "^3.0.0",
133 | "cli-boxes": "^2.2.0",
134 | "string-width": "^4.1.0",
135 | "term-size": "^2.1.0",
136 | "type-fest": "^0.8.1",
137 | "widest-line": "^3.1.0"
138 | },
139 | "dependencies": {
140 | "ansi-regex": {
141 | "version": "5.0.0",
142 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
143 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
144 | "dev": true
145 | },
146 | "ansi-styles": {
147 | "version": "4.3.0",
148 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
149 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
150 | "dev": true,
151 | "requires": {
152 | "color-convert": "^2.0.1"
153 | }
154 | },
155 | "chalk": {
156 | "version": "3.0.0",
157 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
158 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
159 | "dev": true,
160 | "requires": {
161 | "ansi-styles": "^4.1.0",
162 | "supports-color": "^7.1.0"
163 | }
164 | },
165 | "color-convert": {
166 | "version": "2.0.1",
167 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
168 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
169 | "dev": true,
170 | "requires": {
171 | "color-name": "~1.1.4"
172 | }
173 | },
174 | "color-name": {
175 | "version": "1.1.4",
176 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
177 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
178 | "dev": true
179 | },
180 | "emoji-regex": {
181 | "version": "8.0.0",
182 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
183 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
184 | "dev": true
185 | },
186 | "has-flag": {
187 | "version": "4.0.0",
188 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
189 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
190 | "dev": true
191 | },
192 | "is-fullwidth-code-point": {
193 | "version": "3.0.0",
194 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
195 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
196 | "dev": true
197 | },
198 | "string-width": {
199 | "version": "4.2.0",
200 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
201 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
202 | "dev": true,
203 | "requires": {
204 | "emoji-regex": "^8.0.0",
205 | "is-fullwidth-code-point": "^3.0.0",
206 | "strip-ansi": "^6.0.0"
207 | }
208 | },
209 | "strip-ansi": {
210 | "version": "6.0.0",
211 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
212 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
213 | "dev": true,
214 | "requires": {
215 | "ansi-regex": "^5.0.0"
216 | }
217 | },
218 | "supports-color": {
219 | "version": "7.2.0",
220 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
221 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
222 | "dev": true,
223 | "requires": {
224 | "has-flag": "^4.0.0"
225 | }
226 | }
227 | }
228 | },
229 | "brace-expansion": {
230 | "version": "1.1.11",
231 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
232 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
233 | "dev": true,
234 | "requires": {
235 | "balanced-match": "^1.0.0",
236 | "concat-map": "0.0.1"
237 | }
238 | },
239 | "braces": {
240 | "version": "3.0.2",
241 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
242 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
243 | "dev": true,
244 | "requires": {
245 | "fill-range": "^7.0.1"
246 | }
247 | },
248 | "bson": {
249 | "version": "1.1.5",
250 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
251 | "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
252 | },
253 | "buffer-equal-constant-time": {
254 | "version": "1.0.1",
255 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
256 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
257 | },
258 | "bytes": {
259 | "version": "3.1.0",
260 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
261 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
262 | },
263 | "cacheable-request": {
264 | "version": "6.1.0",
265 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
266 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
267 | "dev": true,
268 | "requires": {
269 | "clone-response": "^1.0.2",
270 | "get-stream": "^5.1.0",
271 | "http-cache-semantics": "^4.0.0",
272 | "keyv": "^3.0.0",
273 | "lowercase-keys": "^2.0.0",
274 | "normalize-url": "^4.1.0",
275 | "responselike": "^1.0.2"
276 | },
277 | "dependencies": {
278 | "get-stream": {
279 | "version": "5.2.0",
280 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
281 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
282 | "dev": true,
283 | "requires": {
284 | "pump": "^3.0.0"
285 | }
286 | },
287 | "lowercase-keys": {
288 | "version": "2.0.0",
289 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
290 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
291 | "dev": true
292 | }
293 | }
294 | },
295 | "camelcase": {
296 | "version": "5.3.1",
297 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
298 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
299 | "dev": true
300 | },
301 | "chalk": {
302 | "version": "2.4.2",
303 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
304 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
305 | "dev": true,
306 | "requires": {
307 | "ansi-styles": "^3.2.1",
308 | "escape-string-regexp": "^1.0.5",
309 | "supports-color": "^5.3.0"
310 | },
311 | "dependencies": {
312 | "supports-color": {
313 | "version": "5.5.0",
314 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
315 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
316 | "dev": true,
317 | "requires": {
318 | "has-flag": "^3.0.0"
319 | }
320 | }
321 | }
322 | },
323 | "chokidar": {
324 | "version": "3.4.3",
325 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
326 | "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
327 | "dev": true,
328 | "requires": {
329 | "anymatch": "~3.1.1",
330 | "braces": "~3.0.2",
331 | "fsevents": "~2.1.2",
332 | "glob-parent": "~5.1.0",
333 | "is-binary-path": "~2.1.0",
334 | "is-glob": "~4.0.1",
335 | "normalize-path": "~3.0.0",
336 | "readdirp": "~3.5.0"
337 | }
338 | },
339 | "ci-info": {
340 | "version": "2.0.0",
341 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
342 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
343 | "dev": true
344 | },
345 | "cli-boxes": {
346 | "version": "2.2.1",
347 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
348 | "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
349 | "dev": true
350 | },
351 | "cliui": {
352 | "version": "5.0.0",
353 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
354 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
355 | "dev": true,
356 | "requires": {
357 | "string-width": "^3.1.0",
358 | "strip-ansi": "^5.2.0",
359 | "wrap-ansi": "^5.1.0"
360 | }
361 | },
362 | "clone-response": {
363 | "version": "1.0.2",
364 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
365 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
366 | "dev": true,
367 | "requires": {
368 | "mimic-response": "^1.0.0"
369 | }
370 | },
371 | "color-convert": {
372 | "version": "1.9.3",
373 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
374 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
375 | "dev": true,
376 | "requires": {
377 | "color-name": "1.1.3"
378 | }
379 | },
380 | "color-name": {
381 | "version": "1.1.3",
382 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
383 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
384 | "dev": true
385 | },
386 | "colors": {
387 | "version": "1.4.0",
388 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
389 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
390 | },
391 | "concat-map": {
392 | "version": "0.0.1",
393 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
394 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
395 | "dev": true
396 | },
397 | "concurrently": {
398 | "version": "5.3.0",
399 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz",
400 | "integrity": "sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==",
401 | "dev": true,
402 | "requires": {
403 | "chalk": "^2.4.2",
404 | "date-fns": "^2.0.1",
405 | "lodash": "^4.17.15",
406 | "read-pkg": "^4.0.1",
407 | "rxjs": "^6.5.2",
408 | "spawn-command": "^0.0.2-1",
409 | "supports-color": "^6.1.0",
410 | "tree-kill": "^1.2.2",
411 | "yargs": "^13.3.0"
412 | }
413 | },
414 | "configstore": {
415 | "version": "5.0.1",
416 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
417 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
418 | "dev": true,
419 | "requires": {
420 | "dot-prop": "^5.2.0",
421 | "graceful-fs": "^4.1.2",
422 | "make-dir": "^3.0.0",
423 | "unique-string": "^2.0.0",
424 | "write-file-atomic": "^3.0.0",
425 | "xdg-basedir": "^4.0.0"
426 | }
427 | },
428 | "content-disposition": {
429 | "version": "0.5.3",
430 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
431 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
432 | "requires": {
433 | "safe-buffer": "5.1.2"
434 | }
435 | },
436 | "content-type": {
437 | "version": "1.0.4",
438 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
439 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
440 | },
441 | "cookie": {
442 | "version": "0.4.0",
443 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
444 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
445 | },
446 | "cookie-signature": {
447 | "version": "1.0.6",
448 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
449 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
450 | },
451 | "core-util-is": {
452 | "version": "1.0.2",
453 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
454 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
455 | },
456 | "crypto-random-string": {
457 | "version": "2.0.0",
458 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
459 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
460 | "dev": true
461 | },
462 | "date-fns": {
463 | "version": "2.16.1",
464 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz",
465 | "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==",
466 | "dev": true
467 | },
468 | "debug": {
469 | "version": "2.6.9",
470 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
471 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
472 | "requires": {
473 | "ms": "2.0.0"
474 | }
475 | },
476 | "decamelize": {
477 | "version": "1.2.0",
478 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
479 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
480 | "dev": true
481 | },
482 | "decompress-response": {
483 | "version": "3.3.0",
484 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
485 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
486 | "dev": true,
487 | "requires": {
488 | "mimic-response": "^1.0.0"
489 | }
490 | },
491 | "deep-extend": {
492 | "version": "0.6.0",
493 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
494 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
495 | "dev": true
496 | },
497 | "defer-to-connect": {
498 | "version": "1.1.3",
499 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
500 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
501 | "dev": true
502 | },
503 | "denque": {
504 | "version": "1.4.1",
505 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
506 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
507 | },
508 | "depd": {
509 | "version": "1.1.2",
510 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
511 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
512 | },
513 | "destroy": {
514 | "version": "1.0.4",
515 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
516 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
517 | },
518 | "dot-prop": {
519 | "version": "5.3.0",
520 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
521 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
522 | "dev": true,
523 | "requires": {
524 | "is-obj": "^2.0.0"
525 | }
526 | },
527 | "dotenv": {
528 | "version": "8.2.0",
529 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
530 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
531 | },
532 | "duplexer3": {
533 | "version": "0.1.4",
534 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
535 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
536 | "dev": true
537 | },
538 | "ecdsa-sig-formatter": {
539 | "version": "1.0.11",
540 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
541 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
542 | "requires": {
543 | "safe-buffer": "^5.0.1"
544 | }
545 | },
546 | "ee-first": {
547 | "version": "1.1.1",
548 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
549 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
550 | },
551 | "emoji-regex": {
552 | "version": "7.0.3",
553 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
554 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
555 | "dev": true
556 | },
557 | "encodeurl": {
558 | "version": "1.0.2",
559 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
560 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
561 | },
562 | "end-of-stream": {
563 | "version": "1.4.4",
564 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
565 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
566 | "dev": true,
567 | "requires": {
568 | "once": "^1.4.0"
569 | }
570 | },
571 | "error-ex": {
572 | "version": "1.3.2",
573 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
574 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
575 | "dev": true,
576 | "requires": {
577 | "is-arrayish": "^0.2.1"
578 | }
579 | },
580 | "escape-goat": {
581 | "version": "2.1.1",
582 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
583 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
584 | "dev": true
585 | },
586 | "escape-html": {
587 | "version": "1.0.3",
588 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
589 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
590 | },
591 | "escape-string-regexp": {
592 | "version": "1.0.5",
593 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
594 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
595 | "dev": true
596 | },
597 | "etag": {
598 | "version": "1.8.1",
599 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
600 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
601 | },
602 | "express": {
603 | "version": "4.17.1",
604 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
605 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
606 | "requires": {
607 | "accepts": "~1.3.7",
608 | "array-flatten": "1.1.1",
609 | "body-parser": "1.19.0",
610 | "content-disposition": "0.5.3",
611 | "content-type": "~1.0.4",
612 | "cookie": "0.4.0",
613 | "cookie-signature": "1.0.6",
614 | "debug": "2.6.9",
615 | "depd": "~1.1.2",
616 | "encodeurl": "~1.0.2",
617 | "escape-html": "~1.0.3",
618 | "etag": "~1.8.1",
619 | "finalhandler": "~1.1.2",
620 | "fresh": "0.5.2",
621 | "merge-descriptors": "1.0.1",
622 | "methods": "~1.1.2",
623 | "on-finished": "~2.3.0",
624 | "parseurl": "~1.3.3",
625 | "path-to-regexp": "0.1.7",
626 | "proxy-addr": "~2.0.5",
627 | "qs": "6.7.0",
628 | "range-parser": "~1.2.1",
629 | "safe-buffer": "5.1.2",
630 | "send": "0.17.1",
631 | "serve-static": "1.14.1",
632 | "setprototypeof": "1.1.1",
633 | "statuses": "~1.5.0",
634 | "type-is": "~1.6.18",
635 | "utils-merge": "1.0.1",
636 | "vary": "~1.1.2"
637 | }
638 | },
639 | "express-async-handler": {
640 | "version": "1.1.4",
641 | "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz",
642 | "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ=="
643 | },
644 | "fill-range": {
645 | "version": "7.0.1",
646 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
647 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
648 | "dev": true,
649 | "requires": {
650 | "to-regex-range": "^5.0.1"
651 | }
652 | },
653 | "finalhandler": {
654 | "version": "1.1.2",
655 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
656 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
657 | "requires": {
658 | "debug": "2.6.9",
659 | "encodeurl": "~1.0.2",
660 | "escape-html": "~1.0.3",
661 | "on-finished": "~2.3.0",
662 | "parseurl": "~1.3.3",
663 | "statuses": "~1.5.0",
664 | "unpipe": "~1.0.0"
665 | }
666 | },
667 | "find-up": {
668 | "version": "3.0.0",
669 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
670 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
671 | "dev": true,
672 | "requires": {
673 | "locate-path": "^3.0.0"
674 | }
675 | },
676 | "forwarded": {
677 | "version": "0.1.2",
678 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
679 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
680 | },
681 | "fresh": {
682 | "version": "0.5.2",
683 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
684 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
685 | },
686 | "fsevents": {
687 | "version": "2.1.3",
688 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
689 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
690 | "dev": true,
691 | "optional": true
692 | },
693 | "function-bind": {
694 | "version": "1.1.1",
695 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
696 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
697 | "dev": true
698 | },
699 | "get-caller-file": {
700 | "version": "2.0.5",
701 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
702 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
703 | "dev": true
704 | },
705 | "get-stream": {
706 | "version": "4.1.0",
707 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
708 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
709 | "dev": true,
710 | "requires": {
711 | "pump": "^3.0.0"
712 | }
713 | },
714 | "glob-parent": {
715 | "version": "5.1.1",
716 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
717 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
718 | "dev": true,
719 | "requires": {
720 | "is-glob": "^4.0.1"
721 | }
722 | },
723 | "global-dirs": {
724 | "version": "2.0.1",
725 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
726 | "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
727 | "dev": true,
728 | "requires": {
729 | "ini": "^1.3.5"
730 | }
731 | },
732 | "got": {
733 | "version": "9.6.0",
734 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
735 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
736 | "dev": true,
737 | "requires": {
738 | "@sindresorhus/is": "^0.14.0",
739 | "@szmarczak/http-timer": "^1.1.2",
740 | "cacheable-request": "^6.0.0",
741 | "decompress-response": "^3.3.0",
742 | "duplexer3": "^0.1.4",
743 | "get-stream": "^4.1.0",
744 | "lowercase-keys": "^1.0.1",
745 | "mimic-response": "^1.0.1",
746 | "p-cancelable": "^1.0.0",
747 | "to-readable-stream": "^1.0.0",
748 | "url-parse-lax": "^3.0.0"
749 | }
750 | },
751 | "graceful-fs": {
752 | "version": "4.2.4",
753 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
754 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
755 | "dev": true
756 | },
757 | "has": {
758 | "version": "1.0.3",
759 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
760 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
761 | "dev": true,
762 | "requires": {
763 | "function-bind": "^1.1.1"
764 | }
765 | },
766 | "has-flag": {
767 | "version": "3.0.0",
768 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
769 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
770 | "dev": true
771 | },
772 | "has-yarn": {
773 | "version": "2.1.0",
774 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
775 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
776 | "dev": true
777 | },
778 | "hosted-git-info": {
779 | "version": "2.8.8",
780 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
781 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
782 | "dev": true
783 | },
784 | "http-cache-semantics": {
785 | "version": "4.1.0",
786 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
787 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
788 | "dev": true
789 | },
790 | "http-errors": {
791 | "version": "1.7.2",
792 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
793 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
794 | "requires": {
795 | "depd": "~1.1.2",
796 | "inherits": "2.0.3",
797 | "setprototypeof": "1.1.1",
798 | "statuses": ">= 1.5.0 < 2",
799 | "toidentifier": "1.0.0"
800 | }
801 | },
802 | "iconv-lite": {
803 | "version": "0.4.24",
804 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
805 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
806 | "requires": {
807 | "safer-buffer": ">= 2.1.2 < 3"
808 | }
809 | },
810 | "ignore-by-default": {
811 | "version": "1.0.1",
812 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
813 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
814 | "dev": true
815 | },
816 | "import-lazy": {
817 | "version": "2.1.0",
818 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
819 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
820 | "dev": true
821 | },
822 | "imurmurhash": {
823 | "version": "0.1.4",
824 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
825 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
826 | "dev": true
827 | },
828 | "inherits": {
829 | "version": "2.0.3",
830 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
831 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
832 | },
833 | "ini": {
834 | "version": "1.3.5",
835 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
836 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
837 | "dev": true
838 | },
839 | "ipaddr.js": {
840 | "version": "1.9.1",
841 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
842 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
843 | },
844 | "is-arrayish": {
845 | "version": "0.2.1",
846 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
847 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
848 | "dev": true
849 | },
850 | "is-binary-path": {
851 | "version": "2.1.0",
852 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
853 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
854 | "dev": true,
855 | "requires": {
856 | "binary-extensions": "^2.0.0"
857 | }
858 | },
859 | "is-ci": {
860 | "version": "2.0.0",
861 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
862 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
863 | "dev": true,
864 | "requires": {
865 | "ci-info": "^2.0.0"
866 | }
867 | },
868 | "is-core-module": {
869 | "version": "2.1.0",
870 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
871 | "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
872 | "dev": true,
873 | "requires": {
874 | "has": "^1.0.3"
875 | }
876 | },
877 | "is-extglob": {
878 | "version": "2.1.1",
879 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
880 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
881 | "dev": true
882 | },
883 | "is-fullwidth-code-point": {
884 | "version": "2.0.0",
885 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
886 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
887 | "dev": true
888 | },
889 | "is-glob": {
890 | "version": "4.0.1",
891 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
892 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
893 | "dev": true,
894 | "requires": {
895 | "is-extglob": "^2.1.1"
896 | }
897 | },
898 | "is-installed-globally": {
899 | "version": "0.3.2",
900 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
901 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
902 | "dev": true,
903 | "requires": {
904 | "global-dirs": "^2.0.1",
905 | "is-path-inside": "^3.0.1"
906 | }
907 | },
908 | "is-npm": {
909 | "version": "4.0.0",
910 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
911 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
912 | "dev": true
913 | },
914 | "is-number": {
915 | "version": "7.0.0",
916 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
917 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
918 | "dev": true
919 | },
920 | "is-obj": {
921 | "version": "2.0.0",
922 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
923 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
924 | "dev": true
925 | },
926 | "is-path-inside": {
927 | "version": "3.0.2",
928 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
929 | "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
930 | "dev": true
931 | },
932 | "is-typedarray": {
933 | "version": "1.0.0",
934 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
935 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
936 | "dev": true
937 | },
938 | "is-yarn-global": {
939 | "version": "0.3.0",
940 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
941 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
942 | "dev": true
943 | },
944 | "isarray": {
945 | "version": "1.0.0",
946 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
947 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
948 | },
949 | "json-buffer": {
950 | "version": "3.0.0",
951 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
952 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
953 | "dev": true
954 | },
955 | "json-parse-better-errors": {
956 | "version": "1.0.2",
957 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
958 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
959 | "dev": true
960 | },
961 | "jsonwebtoken": {
962 | "version": "8.5.1",
963 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
964 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
965 | "requires": {
966 | "jws": "^3.2.2",
967 | "lodash.includes": "^4.3.0",
968 | "lodash.isboolean": "^3.0.3",
969 | "lodash.isinteger": "^4.0.4",
970 | "lodash.isnumber": "^3.0.3",
971 | "lodash.isplainobject": "^4.0.6",
972 | "lodash.isstring": "^4.0.1",
973 | "lodash.once": "^4.0.0",
974 | "ms": "^2.1.1",
975 | "semver": "^5.6.0"
976 | },
977 | "dependencies": {
978 | "ms": {
979 | "version": "2.1.2",
980 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
981 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
982 | }
983 | }
984 | },
985 | "jwa": {
986 | "version": "1.4.1",
987 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
988 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
989 | "requires": {
990 | "buffer-equal-constant-time": "1.0.1",
991 | "ecdsa-sig-formatter": "1.0.11",
992 | "safe-buffer": "^5.0.1"
993 | }
994 | },
995 | "jws": {
996 | "version": "3.2.2",
997 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
998 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
999 | "requires": {
1000 | "jwa": "^1.4.1",
1001 | "safe-buffer": "^5.0.1"
1002 | }
1003 | },
1004 | "kareem": {
1005 | "version": "2.3.1",
1006 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
1007 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
1008 | },
1009 | "keyv": {
1010 | "version": "3.1.0",
1011 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
1012 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
1013 | "dev": true,
1014 | "requires": {
1015 | "json-buffer": "3.0.0"
1016 | }
1017 | },
1018 | "latest-version": {
1019 | "version": "5.1.0",
1020 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
1021 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
1022 | "dev": true,
1023 | "requires": {
1024 | "package-json": "^6.3.0"
1025 | }
1026 | },
1027 | "locate-path": {
1028 | "version": "3.0.0",
1029 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
1030 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
1031 | "dev": true,
1032 | "requires": {
1033 | "p-locate": "^3.0.0",
1034 | "path-exists": "^3.0.0"
1035 | }
1036 | },
1037 | "lodash": {
1038 | "version": "4.17.20",
1039 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
1040 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
1041 | "dev": true
1042 | },
1043 | "lodash.includes": {
1044 | "version": "4.3.0",
1045 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
1046 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
1047 | },
1048 | "lodash.isboolean": {
1049 | "version": "3.0.3",
1050 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
1051 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
1052 | },
1053 | "lodash.isinteger": {
1054 | "version": "4.0.4",
1055 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
1056 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
1057 | },
1058 | "lodash.isnumber": {
1059 | "version": "3.0.3",
1060 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
1061 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
1062 | },
1063 | "lodash.isplainobject": {
1064 | "version": "4.0.6",
1065 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
1066 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
1067 | },
1068 | "lodash.isstring": {
1069 | "version": "4.0.1",
1070 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
1071 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
1072 | },
1073 | "lodash.once": {
1074 | "version": "4.1.1",
1075 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
1076 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
1077 | },
1078 | "lowercase-keys": {
1079 | "version": "1.0.1",
1080 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
1081 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
1082 | "dev": true
1083 | },
1084 | "make-dir": {
1085 | "version": "3.1.0",
1086 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1087 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1088 | "dev": true,
1089 | "requires": {
1090 | "semver": "^6.0.0"
1091 | },
1092 | "dependencies": {
1093 | "semver": {
1094 | "version": "6.3.0",
1095 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1096 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1097 | "dev": true
1098 | }
1099 | }
1100 | },
1101 | "media-typer": {
1102 | "version": "0.3.0",
1103 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1104 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1105 | },
1106 | "memory-pager": {
1107 | "version": "1.5.0",
1108 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
1109 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
1110 | "optional": true
1111 | },
1112 | "merge-descriptors": {
1113 | "version": "1.0.1",
1114 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1115 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1116 | },
1117 | "methods": {
1118 | "version": "1.1.2",
1119 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1120 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1121 | },
1122 | "mime": {
1123 | "version": "1.6.0",
1124 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1125 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1126 | },
1127 | "mime-db": {
1128 | "version": "1.44.0",
1129 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
1130 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
1131 | },
1132 | "mime-types": {
1133 | "version": "2.1.27",
1134 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
1135 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
1136 | "requires": {
1137 | "mime-db": "1.44.0"
1138 | }
1139 | },
1140 | "mimic-response": {
1141 | "version": "1.0.1",
1142 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
1143 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
1144 | "dev": true
1145 | },
1146 | "minimatch": {
1147 | "version": "3.0.4",
1148 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1149 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1150 | "dev": true,
1151 | "requires": {
1152 | "brace-expansion": "^1.1.7"
1153 | }
1154 | },
1155 | "minimist": {
1156 | "version": "1.2.5",
1157 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1158 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1159 | "dev": true
1160 | },
1161 | "mongodb": {
1162 | "version": "3.6.3",
1163 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz",
1164 | "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==",
1165 | "requires": {
1166 | "bl": "^2.2.1",
1167 | "bson": "^1.1.4",
1168 | "denque": "^1.4.1",
1169 | "require_optional": "^1.0.1",
1170 | "safe-buffer": "^5.1.2",
1171 | "saslprep": "^1.0.0"
1172 | }
1173 | },
1174 | "mongoose": {
1175 | "version": "5.10.15",
1176 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.15.tgz",
1177 | "integrity": "sha512-3QUWCpMRdFCPIBZkjG/B2OkfMY2WLkR+hv335o4T2mn3ta9kx8qVvXeUDojp3OHMxBZVUyCA+hDyyP4/aKmHuA==",
1178 | "requires": {
1179 | "bson": "^1.1.4",
1180 | "kareem": "2.3.1",
1181 | "mongodb": "3.6.3",
1182 | "mongoose-legacy-pluralize": "1.0.2",
1183 | "mpath": "0.7.0",
1184 | "mquery": "3.2.2",
1185 | "ms": "2.1.2",
1186 | "regexp-clone": "1.0.0",
1187 | "safe-buffer": "5.2.1",
1188 | "sift": "7.0.1",
1189 | "sliced": "1.0.1"
1190 | },
1191 | "dependencies": {
1192 | "ms": {
1193 | "version": "2.1.2",
1194 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1195 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1196 | },
1197 | "safe-buffer": {
1198 | "version": "5.2.1",
1199 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1200 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1201 | }
1202 | }
1203 | },
1204 | "mongoose-legacy-pluralize": {
1205 | "version": "1.0.2",
1206 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
1207 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
1208 | },
1209 | "mpath": {
1210 | "version": "0.7.0",
1211 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz",
1212 | "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg=="
1213 | },
1214 | "mquery": {
1215 | "version": "3.2.2",
1216 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz",
1217 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==",
1218 | "requires": {
1219 | "bluebird": "3.5.1",
1220 | "debug": "3.1.0",
1221 | "regexp-clone": "^1.0.0",
1222 | "safe-buffer": "5.1.2",
1223 | "sliced": "1.0.1"
1224 | },
1225 | "dependencies": {
1226 | "debug": {
1227 | "version": "3.1.0",
1228 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1229 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1230 | "requires": {
1231 | "ms": "2.0.0"
1232 | }
1233 | }
1234 | }
1235 | },
1236 | "ms": {
1237 | "version": "2.0.0",
1238 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1239 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1240 | },
1241 | "negotiator": {
1242 | "version": "0.6.2",
1243 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1244 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1245 | },
1246 | "nodemon": {
1247 | "version": "2.0.6",
1248 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz",
1249 | "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==",
1250 | "dev": true,
1251 | "requires": {
1252 | "chokidar": "^3.2.2",
1253 | "debug": "^3.2.6",
1254 | "ignore-by-default": "^1.0.1",
1255 | "minimatch": "^3.0.4",
1256 | "pstree.remy": "^1.1.7",
1257 | "semver": "^5.7.1",
1258 | "supports-color": "^5.5.0",
1259 | "touch": "^3.1.0",
1260 | "undefsafe": "^2.0.3",
1261 | "update-notifier": "^4.1.0"
1262 | },
1263 | "dependencies": {
1264 | "debug": {
1265 | "version": "3.2.6",
1266 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1267 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1268 | "dev": true,
1269 | "requires": {
1270 | "ms": "^2.1.1"
1271 | }
1272 | },
1273 | "ms": {
1274 | "version": "2.1.2",
1275 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1276 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1277 | "dev": true
1278 | },
1279 | "supports-color": {
1280 | "version": "5.5.0",
1281 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1282 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1283 | "dev": true,
1284 | "requires": {
1285 | "has-flag": "^3.0.0"
1286 | }
1287 | }
1288 | }
1289 | },
1290 | "nopt": {
1291 | "version": "1.0.10",
1292 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1293 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1294 | "dev": true,
1295 | "requires": {
1296 | "abbrev": "1"
1297 | }
1298 | },
1299 | "normalize-package-data": {
1300 | "version": "2.5.0",
1301 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
1302 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
1303 | "dev": true,
1304 | "requires": {
1305 | "hosted-git-info": "^2.1.4",
1306 | "resolve": "^1.10.0",
1307 | "semver": "2 || 3 || 4 || 5",
1308 | "validate-npm-package-license": "^3.0.1"
1309 | }
1310 | },
1311 | "normalize-path": {
1312 | "version": "3.0.0",
1313 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1314 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1315 | "dev": true
1316 | },
1317 | "normalize-url": {
1318 | "version": "4.5.0",
1319 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
1320 | "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
1321 | "dev": true
1322 | },
1323 | "on-finished": {
1324 | "version": "2.3.0",
1325 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1326 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1327 | "requires": {
1328 | "ee-first": "1.1.1"
1329 | }
1330 | },
1331 | "once": {
1332 | "version": "1.4.0",
1333 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1334 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1335 | "dev": true,
1336 | "requires": {
1337 | "wrappy": "1"
1338 | }
1339 | },
1340 | "p-cancelable": {
1341 | "version": "1.1.0",
1342 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
1343 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
1344 | "dev": true
1345 | },
1346 | "p-limit": {
1347 | "version": "2.3.0",
1348 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
1349 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
1350 | "dev": true,
1351 | "requires": {
1352 | "p-try": "^2.0.0"
1353 | }
1354 | },
1355 | "p-locate": {
1356 | "version": "3.0.0",
1357 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
1358 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
1359 | "dev": true,
1360 | "requires": {
1361 | "p-limit": "^2.0.0"
1362 | }
1363 | },
1364 | "p-try": {
1365 | "version": "2.2.0",
1366 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1367 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1368 | "dev": true
1369 | },
1370 | "package-json": {
1371 | "version": "6.5.0",
1372 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
1373 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
1374 | "dev": true,
1375 | "requires": {
1376 | "got": "^9.6.0",
1377 | "registry-auth-token": "^4.0.0",
1378 | "registry-url": "^5.0.0",
1379 | "semver": "^6.2.0"
1380 | },
1381 | "dependencies": {
1382 | "semver": {
1383 | "version": "6.3.0",
1384 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1385 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1386 | "dev": true
1387 | }
1388 | }
1389 | },
1390 | "parse-json": {
1391 | "version": "4.0.0",
1392 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
1393 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
1394 | "dev": true,
1395 | "requires": {
1396 | "error-ex": "^1.3.1",
1397 | "json-parse-better-errors": "^1.0.1"
1398 | }
1399 | },
1400 | "parseurl": {
1401 | "version": "1.3.3",
1402 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1403 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1404 | },
1405 | "path-exists": {
1406 | "version": "3.0.0",
1407 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1408 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1409 | "dev": true
1410 | },
1411 | "path-parse": {
1412 | "version": "1.0.6",
1413 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1414 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1415 | "dev": true
1416 | },
1417 | "path-to-regexp": {
1418 | "version": "0.1.7",
1419 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1420 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1421 | },
1422 | "picomatch": {
1423 | "version": "2.2.2",
1424 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
1425 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
1426 | "dev": true
1427 | },
1428 | "pify": {
1429 | "version": "3.0.0",
1430 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1431 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1432 | "dev": true
1433 | },
1434 | "prepend-http": {
1435 | "version": "2.0.0",
1436 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
1437 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
1438 | "dev": true
1439 | },
1440 | "process-nextick-args": {
1441 | "version": "2.0.1",
1442 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1443 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1444 | },
1445 | "proxy-addr": {
1446 | "version": "2.0.6",
1447 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
1448 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
1449 | "requires": {
1450 | "forwarded": "~0.1.2",
1451 | "ipaddr.js": "1.9.1"
1452 | }
1453 | },
1454 | "pstree.remy": {
1455 | "version": "1.1.8",
1456 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1457 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1458 | "dev": true
1459 | },
1460 | "pump": {
1461 | "version": "3.0.0",
1462 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1463 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1464 | "dev": true,
1465 | "requires": {
1466 | "end-of-stream": "^1.1.0",
1467 | "once": "^1.3.1"
1468 | }
1469 | },
1470 | "pupa": {
1471 | "version": "2.1.1",
1472 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
1473 | "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
1474 | "dev": true,
1475 | "requires": {
1476 | "escape-goat": "^2.0.0"
1477 | }
1478 | },
1479 | "qs": {
1480 | "version": "6.7.0",
1481 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
1482 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
1483 | },
1484 | "range-parser": {
1485 | "version": "1.2.1",
1486 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1487 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1488 | },
1489 | "raw-body": {
1490 | "version": "2.4.0",
1491 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
1492 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
1493 | "requires": {
1494 | "bytes": "3.1.0",
1495 | "http-errors": "1.7.2",
1496 | "iconv-lite": "0.4.24",
1497 | "unpipe": "1.0.0"
1498 | }
1499 | },
1500 | "rc": {
1501 | "version": "1.2.8",
1502 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1503 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1504 | "dev": true,
1505 | "requires": {
1506 | "deep-extend": "^0.6.0",
1507 | "ini": "~1.3.0",
1508 | "minimist": "^1.2.0",
1509 | "strip-json-comments": "~2.0.1"
1510 | }
1511 | },
1512 | "read-pkg": {
1513 | "version": "4.0.1",
1514 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz",
1515 | "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=",
1516 | "dev": true,
1517 | "requires": {
1518 | "normalize-package-data": "^2.3.2",
1519 | "parse-json": "^4.0.0",
1520 | "pify": "^3.0.0"
1521 | }
1522 | },
1523 | "readable-stream": {
1524 | "version": "2.3.7",
1525 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1526 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1527 | "requires": {
1528 | "core-util-is": "~1.0.0",
1529 | "inherits": "~2.0.3",
1530 | "isarray": "~1.0.0",
1531 | "process-nextick-args": "~2.0.0",
1532 | "safe-buffer": "~5.1.1",
1533 | "string_decoder": "~1.1.1",
1534 | "util-deprecate": "~1.0.1"
1535 | }
1536 | },
1537 | "readdirp": {
1538 | "version": "3.5.0",
1539 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
1540 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
1541 | "dev": true,
1542 | "requires": {
1543 | "picomatch": "^2.2.1"
1544 | }
1545 | },
1546 | "regexp-clone": {
1547 | "version": "1.0.0",
1548 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
1549 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
1550 | },
1551 | "registry-auth-token": {
1552 | "version": "4.2.1",
1553 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
1554 | "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
1555 | "dev": true,
1556 | "requires": {
1557 | "rc": "^1.2.8"
1558 | }
1559 | },
1560 | "registry-url": {
1561 | "version": "5.1.0",
1562 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
1563 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
1564 | "dev": true,
1565 | "requires": {
1566 | "rc": "^1.2.8"
1567 | }
1568 | },
1569 | "require-directory": {
1570 | "version": "2.1.1",
1571 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1572 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
1573 | "dev": true
1574 | },
1575 | "require-main-filename": {
1576 | "version": "2.0.0",
1577 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
1578 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
1579 | "dev": true
1580 | },
1581 | "require_optional": {
1582 | "version": "1.0.1",
1583 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
1584 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
1585 | "requires": {
1586 | "resolve-from": "^2.0.0",
1587 | "semver": "^5.1.0"
1588 | }
1589 | },
1590 | "resolve": {
1591 | "version": "1.19.0",
1592 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
1593 | "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
1594 | "dev": true,
1595 | "requires": {
1596 | "is-core-module": "^2.1.0",
1597 | "path-parse": "^1.0.6"
1598 | }
1599 | },
1600 | "resolve-from": {
1601 | "version": "2.0.0",
1602 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
1603 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
1604 | },
1605 | "responselike": {
1606 | "version": "1.0.2",
1607 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
1608 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
1609 | "dev": true,
1610 | "requires": {
1611 | "lowercase-keys": "^1.0.0"
1612 | }
1613 | },
1614 | "rxjs": {
1615 | "version": "6.6.3",
1616 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
1617 | "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
1618 | "dev": true,
1619 | "requires": {
1620 | "tslib": "^1.9.0"
1621 | }
1622 | },
1623 | "safe-buffer": {
1624 | "version": "5.1.2",
1625 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1626 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1627 | },
1628 | "safer-buffer": {
1629 | "version": "2.1.2",
1630 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1631 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1632 | },
1633 | "saslprep": {
1634 | "version": "1.0.3",
1635 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
1636 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
1637 | "optional": true,
1638 | "requires": {
1639 | "sparse-bitfield": "^3.0.3"
1640 | }
1641 | },
1642 | "semver": {
1643 | "version": "5.7.1",
1644 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1645 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1646 | },
1647 | "semver-diff": {
1648 | "version": "3.1.1",
1649 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
1650 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
1651 | "dev": true,
1652 | "requires": {
1653 | "semver": "^6.3.0"
1654 | },
1655 | "dependencies": {
1656 | "semver": {
1657 | "version": "6.3.0",
1658 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1659 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1660 | "dev": true
1661 | }
1662 | }
1663 | },
1664 | "send": {
1665 | "version": "0.17.1",
1666 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1667 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1668 | "requires": {
1669 | "debug": "2.6.9",
1670 | "depd": "~1.1.2",
1671 | "destroy": "~1.0.4",
1672 | "encodeurl": "~1.0.2",
1673 | "escape-html": "~1.0.3",
1674 | "etag": "~1.8.1",
1675 | "fresh": "0.5.2",
1676 | "http-errors": "~1.7.2",
1677 | "mime": "1.6.0",
1678 | "ms": "2.1.1",
1679 | "on-finished": "~2.3.0",
1680 | "range-parser": "~1.2.1",
1681 | "statuses": "~1.5.0"
1682 | },
1683 | "dependencies": {
1684 | "ms": {
1685 | "version": "2.1.1",
1686 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1687 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1688 | }
1689 | }
1690 | },
1691 | "serve-static": {
1692 | "version": "1.14.1",
1693 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1694 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1695 | "requires": {
1696 | "encodeurl": "~1.0.2",
1697 | "escape-html": "~1.0.3",
1698 | "parseurl": "~1.3.3",
1699 | "send": "0.17.1"
1700 | }
1701 | },
1702 | "set-blocking": {
1703 | "version": "2.0.0",
1704 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1705 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
1706 | "dev": true
1707 | },
1708 | "setprototypeof": {
1709 | "version": "1.1.1",
1710 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1711 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1712 | },
1713 | "sift": {
1714 | "version": "7.0.1",
1715 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
1716 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
1717 | },
1718 | "signal-exit": {
1719 | "version": "3.0.3",
1720 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1721 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1722 | "dev": true
1723 | },
1724 | "sliced": {
1725 | "version": "1.0.1",
1726 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
1727 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
1728 | },
1729 | "sparse-bitfield": {
1730 | "version": "3.0.3",
1731 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1732 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
1733 | "optional": true,
1734 | "requires": {
1735 | "memory-pager": "^1.0.2"
1736 | }
1737 | },
1738 | "spawn-command": {
1739 | "version": "0.0.2-1",
1740 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
1741 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=",
1742 | "dev": true
1743 | },
1744 | "spdx-correct": {
1745 | "version": "3.1.1",
1746 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
1747 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
1748 | "dev": true,
1749 | "requires": {
1750 | "spdx-expression-parse": "^3.0.0",
1751 | "spdx-license-ids": "^3.0.0"
1752 | }
1753 | },
1754 | "spdx-exceptions": {
1755 | "version": "2.3.0",
1756 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
1757 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
1758 | "dev": true
1759 | },
1760 | "spdx-expression-parse": {
1761 | "version": "3.0.1",
1762 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
1763 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
1764 | "dev": true,
1765 | "requires": {
1766 | "spdx-exceptions": "^2.1.0",
1767 | "spdx-license-ids": "^3.0.0"
1768 | }
1769 | },
1770 | "spdx-license-ids": {
1771 | "version": "3.0.6",
1772 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
1773 | "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
1774 | "dev": true
1775 | },
1776 | "statuses": {
1777 | "version": "1.5.0",
1778 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1779 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1780 | },
1781 | "string-width": {
1782 | "version": "3.1.0",
1783 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1784 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1785 | "dev": true,
1786 | "requires": {
1787 | "emoji-regex": "^7.0.1",
1788 | "is-fullwidth-code-point": "^2.0.0",
1789 | "strip-ansi": "^5.1.0"
1790 | }
1791 | },
1792 | "string_decoder": {
1793 | "version": "1.1.1",
1794 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1795 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1796 | "requires": {
1797 | "safe-buffer": "~5.1.0"
1798 | }
1799 | },
1800 | "strip-ansi": {
1801 | "version": "5.2.0",
1802 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1803 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1804 | "dev": true,
1805 | "requires": {
1806 | "ansi-regex": "^4.1.0"
1807 | }
1808 | },
1809 | "strip-json-comments": {
1810 | "version": "2.0.1",
1811 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1812 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1813 | "dev": true
1814 | },
1815 | "supports-color": {
1816 | "version": "6.1.0",
1817 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
1818 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
1819 | "dev": true,
1820 | "requires": {
1821 | "has-flag": "^3.0.0"
1822 | }
1823 | },
1824 | "term-size": {
1825 | "version": "2.2.1",
1826 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
1827 | "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
1828 | "dev": true
1829 | },
1830 | "to-readable-stream": {
1831 | "version": "1.0.0",
1832 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
1833 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
1834 | "dev": true
1835 | },
1836 | "to-regex-range": {
1837 | "version": "5.0.1",
1838 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1839 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1840 | "dev": true,
1841 | "requires": {
1842 | "is-number": "^7.0.0"
1843 | }
1844 | },
1845 | "toidentifier": {
1846 | "version": "1.0.0",
1847 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1848 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1849 | },
1850 | "touch": {
1851 | "version": "3.1.0",
1852 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1853 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1854 | "dev": true,
1855 | "requires": {
1856 | "nopt": "~1.0.10"
1857 | }
1858 | },
1859 | "tree-kill": {
1860 | "version": "1.2.2",
1861 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
1862 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
1863 | "dev": true
1864 | },
1865 | "tslib": {
1866 | "version": "1.14.1",
1867 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
1868 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
1869 | "dev": true
1870 | },
1871 | "type-fest": {
1872 | "version": "0.8.1",
1873 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
1874 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
1875 | "dev": true
1876 | },
1877 | "type-is": {
1878 | "version": "1.6.18",
1879 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1880 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1881 | "requires": {
1882 | "media-typer": "0.3.0",
1883 | "mime-types": "~2.1.24"
1884 | }
1885 | },
1886 | "typedarray-to-buffer": {
1887 | "version": "3.1.5",
1888 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
1889 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
1890 | "dev": true,
1891 | "requires": {
1892 | "is-typedarray": "^1.0.0"
1893 | }
1894 | },
1895 | "undefsafe": {
1896 | "version": "2.0.3",
1897 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
1898 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
1899 | "dev": true,
1900 | "requires": {
1901 | "debug": "^2.2.0"
1902 | }
1903 | },
1904 | "unique-string": {
1905 | "version": "2.0.0",
1906 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
1907 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
1908 | "dev": true,
1909 | "requires": {
1910 | "crypto-random-string": "^2.0.0"
1911 | }
1912 | },
1913 | "unpipe": {
1914 | "version": "1.0.0",
1915 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1916 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1917 | },
1918 | "update-notifier": {
1919 | "version": "4.1.3",
1920 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
1921 | "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
1922 | "dev": true,
1923 | "requires": {
1924 | "boxen": "^4.2.0",
1925 | "chalk": "^3.0.0",
1926 | "configstore": "^5.0.1",
1927 | "has-yarn": "^2.1.0",
1928 | "import-lazy": "^2.1.0",
1929 | "is-ci": "^2.0.0",
1930 | "is-installed-globally": "^0.3.1",
1931 | "is-npm": "^4.0.0",
1932 | "is-yarn-global": "^0.3.0",
1933 | "latest-version": "^5.0.0",
1934 | "pupa": "^2.0.1",
1935 | "semver-diff": "^3.1.1",
1936 | "xdg-basedir": "^4.0.0"
1937 | },
1938 | "dependencies": {
1939 | "ansi-styles": {
1940 | "version": "4.3.0",
1941 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1942 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1943 | "dev": true,
1944 | "requires": {
1945 | "color-convert": "^2.0.1"
1946 | }
1947 | },
1948 | "chalk": {
1949 | "version": "3.0.0",
1950 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
1951 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
1952 | "dev": true,
1953 | "requires": {
1954 | "ansi-styles": "^4.1.0",
1955 | "supports-color": "^7.1.0"
1956 | }
1957 | },
1958 | "color-convert": {
1959 | "version": "2.0.1",
1960 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1961 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1962 | "dev": true,
1963 | "requires": {
1964 | "color-name": "~1.1.4"
1965 | }
1966 | },
1967 | "color-name": {
1968 | "version": "1.1.4",
1969 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1970 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1971 | "dev": true
1972 | },
1973 | "has-flag": {
1974 | "version": "4.0.0",
1975 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1976 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1977 | "dev": true
1978 | },
1979 | "supports-color": {
1980 | "version": "7.2.0",
1981 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1982 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1983 | "dev": true,
1984 | "requires": {
1985 | "has-flag": "^4.0.0"
1986 | }
1987 | }
1988 | }
1989 | },
1990 | "url-parse-lax": {
1991 | "version": "3.0.0",
1992 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
1993 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
1994 | "dev": true,
1995 | "requires": {
1996 | "prepend-http": "^2.0.0"
1997 | }
1998 | },
1999 | "util-deprecate": {
2000 | "version": "1.0.2",
2001 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2002 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2003 | },
2004 | "utils-merge": {
2005 | "version": "1.0.1",
2006 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2007 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
2008 | },
2009 | "validate-npm-package-license": {
2010 | "version": "3.0.4",
2011 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
2012 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
2013 | "dev": true,
2014 | "requires": {
2015 | "spdx-correct": "^3.0.0",
2016 | "spdx-expression-parse": "^3.0.0"
2017 | }
2018 | },
2019 | "vary": {
2020 | "version": "1.1.2",
2021 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2022 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
2023 | },
2024 | "which-module": {
2025 | "version": "2.0.0",
2026 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
2027 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
2028 | "dev": true
2029 | },
2030 | "widest-line": {
2031 | "version": "3.1.0",
2032 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
2033 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
2034 | "dev": true,
2035 | "requires": {
2036 | "string-width": "^4.0.0"
2037 | },
2038 | "dependencies": {
2039 | "ansi-regex": {
2040 | "version": "5.0.0",
2041 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
2042 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
2043 | "dev": true
2044 | },
2045 | "emoji-regex": {
2046 | "version": "8.0.0",
2047 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2048 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2049 | "dev": true
2050 | },
2051 | "is-fullwidth-code-point": {
2052 | "version": "3.0.0",
2053 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2054 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
2055 | "dev": true
2056 | },
2057 | "string-width": {
2058 | "version": "4.2.0",
2059 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
2060 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
2061 | "dev": true,
2062 | "requires": {
2063 | "emoji-regex": "^8.0.0",
2064 | "is-fullwidth-code-point": "^3.0.0",
2065 | "strip-ansi": "^6.0.0"
2066 | }
2067 | },
2068 | "strip-ansi": {
2069 | "version": "6.0.0",
2070 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
2071 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
2072 | "dev": true,
2073 | "requires": {
2074 | "ansi-regex": "^5.0.0"
2075 | }
2076 | }
2077 | }
2078 | },
2079 | "wrap-ansi": {
2080 | "version": "5.1.0",
2081 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
2082 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
2083 | "dev": true,
2084 | "requires": {
2085 | "ansi-styles": "^3.2.0",
2086 | "string-width": "^3.0.0",
2087 | "strip-ansi": "^5.0.0"
2088 | }
2089 | },
2090 | "wrappy": {
2091 | "version": "1.0.2",
2092 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2093 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2094 | "dev": true
2095 | },
2096 | "write-file-atomic": {
2097 | "version": "3.0.3",
2098 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
2099 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
2100 | "dev": true,
2101 | "requires": {
2102 | "imurmurhash": "^0.1.4",
2103 | "is-typedarray": "^1.0.0",
2104 | "signal-exit": "^3.0.2",
2105 | "typedarray-to-buffer": "^3.1.5"
2106 | }
2107 | },
2108 | "xdg-basedir": {
2109 | "version": "4.0.0",
2110 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
2111 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
2112 | "dev": true
2113 | },
2114 | "y18n": {
2115 | "version": "4.0.0",
2116 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
2117 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
2118 | "dev": true
2119 | },
2120 | "yargs": {
2121 | "version": "13.3.2",
2122 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
2123 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
2124 | "dev": true,
2125 | "requires": {
2126 | "cliui": "^5.0.0",
2127 | "find-up": "^3.0.0",
2128 | "get-caller-file": "^2.0.1",
2129 | "require-directory": "^2.1.1",
2130 | "require-main-filename": "^2.0.0",
2131 | "set-blocking": "^2.0.0",
2132 | "string-width": "^3.0.0",
2133 | "which-module": "^2.0.0",
2134 | "y18n": "^4.0.0",
2135 | "yargs-parser": "^13.1.2"
2136 | }
2137 | },
2138 | "yargs-parser": {
2139 | "version": "13.1.2",
2140 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
2141 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
2142 | "dev": true,
2143 | "requires": {
2144 | "camelcase": "^5.0.0",
2145 | "decamelize": "^1.2.0"
2146 | }
2147 | }
2148 | }
2149 | }
2150 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "notezipper",
3 | "version": "1.0.0",
4 | "description": "Notes Taking App",
5 | "main": "server.js",
6 | "type": "module",
7 | "scripts": {
8 | "start": "node backend/server",
9 | "server": "nodemon backend/server",
10 | "client": "npm start --prefix frontend",
11 | "dev": "concurrently \"npm run server\" \"npm run client\"",
12 | "data:import": "node backend/seeder",
13 | "data:destroy": "node backend/seeder -d"
14 | },
15 | "author": "Piyush Agarwal",
16 | "license": "ISC",
17 | "dependencies": {
18 | "bcryptjs": "^2.4.3",
19 | "colors": "^1.4.0",
20 | "dotenv": "^8.2.0",
21 | "express": "^4.17.1",
22 | "express-async-handler": "^1.1.4",
23 | "jsonwebtoken": "^8.5.1",
24 | "mongoose": "^5.10.15"
25 | },
26 | "devDependencies": {
27 | "concurrently": "^5.3.0",
28 | "nodemon": "^2.0.6"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------