From d669baa80a3848dba00f9f5850c6268298b1138c Mon Sep 17 00:00:00 2001 From: Yash Karanke Date: Tue, 28 Sep 2021 22:32:18 +0530 Subject: [PATCH 01/20] Shifting to NoSQL --- .env.prod | 5 +- controllers/admin.js | 151 +++++++++++++++++---------------- controllers/shop.js | 86 ++++++++++--------- models/product.js | 62 +++++++++----- package-lock.json | 64 +++++++++----- package.json | 4 +- routes/admin.js | 8 +- routes/shop.js | 13 ++- server.js | 57 +++---------- utils/database.js | 36 ++++++-- views/includes/add-to-cart.ejs | 4 +- views/includes/navigation.ejs | 92 ++++++++++---------- views/shop/cart.ejs | 52 ++++++------ views/shop/index.ejs | 3 +- views/shop/orders.ejs | 34 ++++---- views/shop/product-detail.ejs | 22 ++--- views/shop/product-list.ejs | 4 +- 17 files changed, 369 insertions(+), 328 deletions(-) diff --git a/.env.prod b/.env.prod index d3e4ac4..0c97be8 100644 --- a/.env.prod +++ b/.env.prod @@ -1 +1,4 @@ -PORT = 8080 \ No newline at end of file +PORT = 8080 +MONGO_DB_USER = karankeyash +MONGO_DB_PASS = 5iQjbOd5VsALNtKL +MONGO_CONNECTION = mongodb+srv://karankeyash:5iQjbOd5VsALNtKL@core-server-nosql.62k6j.mongodb.net/myFirstDatabase?retryWrites=true&w=majority \ No newline at end of file diff --git a/controllers/admin.js b/controllers/admin.js index 6a5c742..76645ab 100644 --- a/controllers/admin.js +++ b/controllers/admin.js @@ -13,83 +13,86 @@ exports.postAddProduct = (req, res, next) => { const imageUrl = req.body.imageUrl; const price = req.body.price; const description = req.body.description; - /** - * @description Magic Association Method - * @summary `.create()` is an in built Method and `Product` is our Model, therefore sequelize creates a - * MAM for us when we use `hasMany` or/and `belongsTo` methods to our models - * */ - - req.user - .createProduct({ - title, - imageUrl, - price, - description, + const product = new Product(title, price, description, imageUrl); + product + .save() + .then((result) => { + // console.log(result); + console.log("Created Product"); + res.redirect("/admin/products"); }) - .then(() => res.redirect("/admin/products")) - .catch((err) => console.error(err)); + .catch((err) => { + console.log(err); + }); }; -exports.getEditProduct = (req, res, next) => { - const editMode = req.query.edit; - if (!editMode) { - return res.redirect("/"); - } - const prodId = req.params.productId; - req.user - .getProducts({ where: { id: prodId } }) - .then((products) => { - const product = products[0]; - if (!product) { - return res.redirect("/"); - } - res.render("admin/edit-product", { - pageTitle: "Edit Product", - path: "/admin/edit-product", - editing: editMode, - product: product, - }); - }) - .catch((err) => console.error(err)); -}; +// exports.getEditProduct = (req, res, next) => { +// const editMode = req.query.edit; +// if (!editMode) { +// return res.redirect('/'); +// } +// const prodId = req.params.productId; +// req.user +// .getProducts({ where: { id: prodId } }) +// // Product.findById(prodId) +// .then(products => { +// const product = products[0]; +// if (!product) { +// return res.redirect('/'); +// } +// res.render('admin/edit-product', { +// pageTitle: 'Edit Product', +// path: '/admin/edit-product', +// editing: editMode, +// product: product +// }); +// }) +// .catch(err => console.log(err)); +// }; -exports.postEditProduct = (req, res, next) => { - const prodId = req.body.productId; - const updatedTitle = req.body.title; - const updatedPrice = req.body.price; - const updatedImageUrl = req.body.imageUrl; - const updatedDesc = req.body.description; - Product.findByPk(prodId) - .then((product) => { - product.title = updatedTitle; - product.price = updatedPrice; - product.imageUrl = updatedImageUrl; - product.description = updatedDesc; - return product.save(); - }) - .then(() => res.redirect("/admin/products")) - .catch((err) => console.log(err)); -}; +// exports.postEditProduct = (req, res, next) => { +// const prodId = req.body.productId; +// const updatedTitle = req.body.title; +// const updatedPrice = req.body.price; +// const updatedImageUrl = req.body.imageUrl; +// const updatedDesc = req.body.description; +// Product.findById(prodId) +// .then(product => { +// product.title = updatedTitle; +// product.price = updatedPrice; +// product.description = updatedDesc; +// product.imageUrl = updatedImageUrl; +// return product.save(); +// }) +// .then(result => { +// console.log('UPDATED PRODUCT!'); +// res.redirect('/admin/products'); +// }) +// .catch(err => console.log(err)); +// }; -exports.getProducts = (req, res, next) => { - req.user - .getProducts() - .then((products) => { - res.render("admin/products", { - prods: products, - pageTitle: "Admin Products", - path: "/admin/products", - }); - }) - .catch((err) => console.log(err)); -}; +// exports.getProducts = (req, res, next) => { +// req.user +// .getProducts() +// .then(products => { +// res.render('admin/products', { +// prods: products, +// pageTitle: 'Admin Products', +// path: '/admin/products' +// }); +// }) +// .catch(err => console.log(err)); +// }; -exports.postDeleteProduct = (req, res, next) => { - const prodId = req.body.productId; - Product.findByPk(prodId) - .then((prod) => { - return prod.destroy(); - }) - .then(() => res.redirect("/admin/products")) - .catch((err) => console.error(err)); -}; +// exports.postDeleteProduct = (req, res, next) => { +// const prodId = req.body.productId; +// Product.findById(prodId) +// .then(product => { +// return product.destroy(); +// }) +// .then(result => { +// console.log('DESTROYED PRODUCT'); +// res.redirect('/admin/products'); +// }) +// .catch(err => console.log(err)); +// }; diff --git a/controllers/shop.js b/controllers/shop.js index dac7c7f..7de9fb6 100644 --- a/controllers/shop.js +++ b/controllers/shop.js @@ -1,32 +1,43 @@ const Product = require("../models/product"); exports.getProducts = (req, res, next) => { - Product.findAll() - .then((products) => + Product.fetchAll() + .then((products) => { res.render("shop/product-list", { prods: products, pageTitle: "All Products", path: "/products", - }) - ) - .catch((err) => console.error(err)); + }); + }) + .catch((err) => { + console.log(err); + }); }; exports.getProduct = (req, res, next) => { const prodId = req.params.productId; - Product.findByPk(prodId) - .then((product) => + // Product.findAll({ where: { id: prodId } }) + // .then(products => { + // res.render('shop/product-detail', { + // product: products[0], + // pageTitle: products[0].title, + // path: '/products' + // }); + // }) + // .catch(err => console.log(err)); + Product.findById(prodId) + .then((product) => { res.render("shop/product-detail", { product: product, pageTitle: product.title, path: "/products", - }) - ) - .catch((err) => console.error(err)); + }); + }) + .catch((err) => console.log(err)); }; exports.getIndex = (req, res, next) => { - Product.findAll() + Product.fetchAll() .then((products) => { res.render("shop/index", { prods: products, @@ -34,7 +45,9 @@ exports.getIndex = (req, res, next) => { path: "/", }); }) - .catch((err) => console.error(err)); + .catch((err) => { + console.log(err); + }); }; exports.getCart = (req, res, next) => { @@ -50,19 +63,15 @@ exports.getCart = (req, res, next) => { products: products, }); }) - .catch((err) => { - console.log(err); - }); + .catch((err) => console.log(err)); }) - .catch((err) => { - console.log(err); - }); + .catch((err) => console.log(err)); }; exports.postCart = (req, res, next) => { const prodId = req.body.productId; - let newQty = 1; let fetchedCart; + let newQuantity = 1; req.user .getCart() .then((cart) => { @@ -74,24 +83,23 @@ exports.postCart = (req, res, next) => { if (products.length > 0) { product = products[0]; } + if (product) { - const oldQty = product.cartItem.quantity; - newQty = oldQty + 1; + const oldQuantity = product.cartItem.quantity; + newQuantity = oldQuantity + 1; return product; } - return Product.findByPk(prodId); + return Product.findById(prodId); }) .then((product) => { return fetchedCart.addProduct(product, { - through: { - quantity: newQty, - }, + through: { quantity: newQuantity }, }); }) .then(() => { res.redirect("/cart"); }) - .catch((error) => console.error(error)); + .catch((err) => console.log(err)); }; exports.postCartDeleteProduct = (req, res, next) => { @@ -103,10 +111,12 @@ exports.postCartDeleteProduct = (req, res, next) => { }) .then((products) => { const product = products[0]; - product.cartItem.destroy(); + return product.cartItem.destroy(); + }) + .then((result) => { + res.redirect("/cart"); }) - .then((result) => res.redirect("/cart")) - .catch((err) => console.error(err)); + .catch((err) => console.log(err)); }; exports.postOrder = (req, res, next) => { @@ -128,19 +138,19 @@ exports.postOrder = (req, res, next) => { }) ); }) - .then(() => { - return fetchedCart.setProducts(null); - }) - .then(() => { - res.redirect("/orders"); - }) - .catch((err) => console.error(err)); + .catch((err) => console.log(err)); + }) + .then((result) => { + return fetchedCart.setProducts(null); + }) + .then((result) => { + res.redirect("/orders"); }) .catch((err) => console.log(err)); }; exports.getOrders = (req, res, next) => { - return req.user + req.user .getOrders({ include: ["products"] }) .then((orders) => { res.render("shop/orders", { @@ -149,5 +159,5 @@ exports.getOrders = (req, res, next) => { orders: orders, }); }) - .catch((err) => console.error(err)); + .catch((err) => console.log(err)); }; diff --git a/models/product.js b/models/product.js index c105922..a23681e 100644 --- a/models/product.js +++ b/models/product.js @@ -1,26 +1,42 @@ -const Sequelize = require("sequelize"); -const sequelize = require("../utils/database"); +const mongodb = require("mongodb"); +const getDb = require("../utils/database").getDb; -const Product = sequelize.define("product", { - id: { - type: Sequelize.INTEGER, - autoIncrement: true, - allowNull: false, - primaryKey: true, - }, - title: Sequelize.STRING, - price: { - type: Sequelize.DOUBLE, - allowNull: false, - }, - imageUrl: { - type: Sequelize.STRING, - allowNull: false, - }, - description: { - type: Sequelize.STRING, - allowNull: false, - }, -}); +class Product { + constructor(title, price, description, imageUrl) { + this.title = title; + this.price = price; + this.description = description; + this.imageUrl = imageUrl; + } + save() { + const db = getDb(); + return db + .collection("products") + .insertOne(this) + .then((res) => console.log(res)) + .catch((err) => console.error(err)); + } + static fetchAll() { + const db = getDb(); + return db + .collection("products") + .find() + .toArray() + .then((res) => { + return res; + }) + .catch((err) => console.log(err)); + } + + static findById(prodId) { + const db = getDb(); + return db + .collection("products") + .find({ _id: new mongodb.ObjectId(prodId) }) + .next() + .then((product) => product) + .catch((err) => console.error(err)); + } +} module.exports = Product; diff --git a/package-lock.json b/package-lock.json index 41235da..5a615ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1777,9 +1777,9 @@ } }, "bson": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.5.1.tgz", - "integrity": "sha512-XqFP74pbTVLyLy5KFxVfTUyRrC1mgOlmu/iXHfXqfCKT59jyP9lwbotGfbN59cHBRbJSamZNkrSopjv+N0SqAA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.5.2.tgz", + "integrity": "sha512-8CEMJpwc7qlQtrn2rney38jQSEeMar847lz0LyitwRmVknAW8iHXrzW4fTjHfyWm0E3sukyD/zppdH+QU1QefA==", "requires": { "buffer": "^5.6.0" } @@ -3875,34 +3875,49 @@ } }, "mongodb": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.1.1.tgz", - "integrity": "sha512-fbACrWEyvr6yl0sSiCGV0sqEiBwTtDJ8iSojmkDjAfw9JnOZSAkUyv9seFSPYhPPKwxp1PDtyjvBNfMDz0WBLQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.1.2.tgz", + "integrity": "sha512-pHCKDoOy1h6mVurziJmXmTMPatYWOx8pbnyFgSgshja9Y36Q+caHUzTDY6rrIy9HCSrjnbXmx3pCtvNZHmR8xg==", "requires": { - "bson": "^4.5.1", - "denque": "^1.5.0", + "bson": "^4.5.2", + "denque": "^2.0.1", "mongodb-connection-string-url": "^2.0.0", - "saslprep": "^1.0.0" + "saslprep": "^1.0.3" + }, + "dependencies": { + "bson": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.5.2.tgz", + "integrity": "sha512-8CEMJpwc7qlQtrn2rney38jQSEeMar847lz0LyitwRmVknAW8iHXrzW4fTjHfyWm0E3sukyD/zppdH+QU1QefA==", + "requires": { + "buffer": "^5.6.0" + } + }, + "denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + } } }, "mongodb-connection-string-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.0.0.tgz", - "integrity": "sha512-M0I1vyLoq5+HQTuPSJWbt+hIXsMCfE8sS1fS5mvP9R2DOMoi2ZD32yWqgBIITyu0dFu4qtS50erxKjvUeBiyog==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.1.0.tgz", + "integrity": "sha512-Qf9Zw7KGiRljWvMrrUFDdVqo46KIEiDuCzvEN97rh/PcKzk2bd6n9KuzEwBwW9xo5glwx69y1mI6s+jFUD/aIQ==", "requires": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^9.1.0" } }, "mongoose": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.2.tgz", - "integrity": "sha512-4zrCcScAItE9aefaPMeG9+IPLaJJ2c8sFLXlLvTVPdArZija10rto61qkzIxmhf6zkDmW2W9bh3DS59KuTPCfQ==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.7.tgz", + "integrity": "sha512-44STDcV6awu0zfo1Z3NyKPHZwfVrGU93/QgR0gYbt4bik/nEa7lI1RRGcq5oyGM0YE7l63i2j80v1OhvrlFvYw==", "requires": { "bson": "^4.2.2", "kareem": "2.3.2", "mongodb": "4.1.1", - "mpath": "0.8.3", + "mpath": "0.8.4", "mquery": "4.0.0", "ms": "2.1.2", "regexp-clone": "1.0.0", @@ -3910,6 +3925,17 @@ "sliced": "1.0.1" }, "dependencies": { + "mongodb": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.1.1.tgz", + "integrity": "sha512-fbACrWEyvr6yl0sSiCGV0sqEiBwTtDJ8iSojmkDjAfw9JnOZSAkUyv9seFSPYhPPKwxp1PDtyjvBNfMDz0WBLQ==", + "requires": { + "bson": "^4.5.1", + "denque": "^1.5.0", + "mongodb-connection-string-url": "^2.0.0", + "saslprep": "^1.0.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -3918,9 +3944,9 @@ } }, "mpath": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", - "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==" + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" }, "mquery": { "version": "4.0.0", diff --git a/package.json b/package.json index 2cb063e..b3c0c4b 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,8 @@ "graphql-tools": "^8.1.0", "http": "0.0.1-security", "https": "^1.0.0", - "mongodb": "^4.1.1", - "mongoose": "^6.0.2", + "mongodb": "^4.1.2", + "mongoose": "^6.0.7", "multer": "^1.4.3", "mysql2": "^2.3.0", "os": "^0.1.2", diff --git a/routes/admin.js b/routes/admin.js index bab323f..5b6f52d 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -10,15 +10,15 @@ const router = express.Router(); router.get("/add-product", adminController.getAddProduct); // /admin/products => GET -router.get("/products", adminController.getProducts); +// router.get("/products", adminController.getProducts); // /admin/add-product => POST router.post("/add-product", adminController.postAddProduct); -router.get("/edit-product/:productId", adminController.getEditProduct); +// router.get("/edit-product/:productId", adminController.getEditProduct); -router.post("/edit-product", adminController.postEditProduct); +// router.post("/edit-product", adminController.postEditProduct); -router.post("/delete-product", adminController.postDeleteProduct); +// router.post("/delete-product", adminController.postDeleteProduct); module.exports = router; diff --git a/routes/shop.js b/routes/shop.js index 20a78c3..f1dfe66 100644 --- a/routes/shop.js +++ b/routes/shop.js @@ -1,9 +1,6 @@ -const path = require("path"); - const express = require("express"); const shopController = require("../controllers/shop"); - const router = express.Router(); router.get("/", shopController.getIndex); @@ -12,14 +9,14 @@ router.get("/products", shopController.getProducts); router.get("/products/:productId", shopController.getProduct); -router.get("/cart", shopController.getCart); +// router.get("/cart", shopController.getCart); -router.post("/cart", shopController.postCart); +// router.post("/cart", shopController.postCart); -router.post("/cart-delete-item", shopController.postCartDeleteProduct); +// router.post("/cart-delete-item", shopController.postCartDeleteProduct); -router.post("/create-order", shopController.postOrder); +// router.post("/create-order", shopController.postOrder); -router.get("/orders", shopController.getOrders); +// router.get("/orders", shopController.getOrders); module.exports = router; diff --git a/server.js b/server.js index 8e43059..936b3af 100644 --- a/server.js +++ b/server.js @@ -1,11 +1,6 @@ const path = require("path"); -const sequelize = require("./utils/database"); -const Product = require("./models/product"); -const User = require("./models/user"); -const Cart = require("./models/cart"); -const CartItem = require("./models/cartItem"); -const Order = require("./models/order"); -const OrderItem = require("./models/orderItems"); +// const User = require("./models/user"); +const mongoConnect = require("./utils/database").mongoConnect; const express = require("express"); const bodyParser = require("body-parser"); @@ -28,12 +23,13 @@ const shopRoutes = require("./routes/shop"); app.use(bodyParser.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, "public"))); app.use((req, res, next) => { - User.findByPk(1) - .then((user) => { - req.user = user; - next(); - }) - .catch((err) => console.error(err)); + // User.findByPk(1) + // .then((user) => { + // req.user = user; + // next(); + // }) + // .catch((err) => console.error(err)); + next(); }); app.use("/admin", adminRoutes); @@ -56,35 +52,8 @@ app.post("/api/v1/images", uploads.single("thumbnail"), async (req, res) => { app.use(errorController.get404); const port = process.env.PORT || 5000; -Product.belongsTo(User, { constraints: true, onDelete: "CASCADE" }); -User.hasMany(Product); -User.hasOne(Cart); -Cart.belongsTo(User); -Cart.belongsToMany(Product, { through: CartItem }); -Product.belongsToMany(Cart, { through: CartItem }); -Order.belongsTo(User); -User.hasMany(Order); -Order.belongsToMany(Product, { through: OrderItem }); - -sequelize - .sync() - .then((res) => { - return User.findByPk(1); - }) - .then((user) => { - if (!user) { - return User.create({ - name: "Max", - email: "user@gmail.com", - }); - } - return user; - }) - .then((user) => { - return user.createCart(); - }) - .catch((err) => console.error(err)); - -app.listen(port, () => { - console.log(`server is running on ${port}`); +mongoConnect(() => { + app.listen(port, () => { + console.log(`server is running on ${port}`); + }); }); diff --git a/utils/database.js b/utils/database.js index 700d1d6..abe4863 100644 --- a/utils/database.js +++ b/utils/database.js @@ -1,8 +1,28 @@ -const Sequelize = require("sequelize"); -const dbConfig = require("./db.config"); -const sequelize = new Sequelize(dbConfig.DB_NAME, dbConfig.USERNAME, dbConfig.PASSWORD, { - host: dbConfig.HOST, - dialect: dbConfig.DIALECT, -}); - -module.exports = sequelize; +const mongodb = require("mongodb"); +const MongoClient = mongodb.MongoClient; + +let _db; + +const mongoConnect = (callback) => { + MongoClient.connect("mongodb+srv://karankeyash:5iQjbOd5VsALNtKL@core-server-nosql.62k6j.mongodb.net/shop?retryWrites=true&w=majority") + .then((client) => { + _db = client.db(""); + console.log("Connected"); + callback(); + }) + .catch((err) => { + console.error(err); + throw new Error("An Error Occured"); + }); +}; + +const getDb = () => { + if (_db) { + return _db; + } else { + throw new Error("No Database found"); + } +}; + +exports.mongoConnect = mongoConnect; +exports.getDb = getDb; diff --git a/views/includes/add-to-cart.ejs b/views/includes/add-to-cart.ejs index 4a58ed5..8320fe9 100644 --- a/views/includes/add-to-cart.ejs +++ b/views/includes/add-to-cart.ejs @@ -1,4 +1,4 @@ -
- + +
diff --git a/views/includes/navigation.ejs b/views/includes/navigation.ejs index 974ac6d..a8b7e57 100644 --- a/views/includes/navigation.ejs +++ b/views/includes/navigation.ejs @@ -1,53 +1,49 @@
- - + +
\ No newline at end of file + + diff --git a/views/shop/cart.ejs b/views/shop/cart.ejs index 56fcf27..b1facad 100644 --- a/views/shop/cart.ejs +++ b/views/shop/cart.ejs @@ -1,32 +1,32 @@ <%- include('../includes/head.ejs') %> - - + <%- include('../includes/navigation.ejs') %>
- <% if(products.length > 0) { %> - -
-
- -
-
- - <% } else { %> -

No Products in cart

- <% } %> -
- <%- include('../includes/end.ejs') %> \ No newline at end of file + <% if (products.length > 0) { %> + +
+
+
+ +
+
+ + <% } else { %> +

No Products in Cart!

+ <% } %> + + <%- include('../includes/end.ejs') %> \ No newline at end of file diff --git a/views/shop/index.ejs b/views/shop/index.ejs index 30f7d7d..c466460 100644 --- a/views/shop/index.ejs +++ b/views/shop/index.ejs @@ -22,7 +22,8 @@

<%= product.description %>

- <%- include("../includes/add-to-cart.ejs",{product}) %> + Details + <%- include('../includes/add-to-cart.ejs', {product: product}) %>
<% } %> diff --git a/views/shop/orders.ejs b/views/shop/orders.ejs index f3843b8..bf90ba5 100644 --- a/views/shop/orders.ejs +++ b/views/shop/orders.ejs @@ -1,25 +1,25 @@ <%- include('../includes/head.ejs') %> + <%- include('../includes/navigation.ejs') %>
- <% if(orders.length <= 0) { %> -

Nothing there!

- <% } else { %> - - <% } %> - + <% if (orders.length <= 0) { %> +

Nothing there!

+ <% } else { %> + + <% } %>
<%- include('../includes/end.ejs') %> \ No newline at end of file diff --git a/views/shop/product-detail.ejs b/views/shop/product-detail.ejs index 002c780..22cbf46 100644 --- a/views/shop/product-detail.ejs +++ b/views/shop/product-detail.ejs @@ -3,14 +3,14 @@ <%- include('../includes/navigation.ejs') %> -
-

<%= product.title %>

-
-
- <%= product.title %> -
-

$<%= product.price %>

-

<%= product.description %>

- <%- include("../includes/add-to-cart.ejs") %> -
- <%- include('../includes/end.ejs') %> +
+

<%= product.title %>

+
+
+ <%= product.title %> +
+

$<%= product.price %>

+

<%= product.description %>

+ <%- include('../includes/add-to-cart.ejs') %> +
+ <%- include('../includes/end.ejs') %> \ No newline at end of file diff --git a/views/shop/product-list.ejs b/views/shop/product-list.ejs index 5edccdd..a687270 100644 --- a/views/shop/product-list.ejs +++ b/views/shop/product-list.ejs @@ -27,8 +27,8 @@

- Details - <%- include("../includes/add-to-cart.ejs",{product}) %> + Details + <%- include('../includes/add-to-cart.ejs', {product: product}) %>
<% } %> From ba068260ed24fb7e4518750d5ec7deaa8b5d1756 Mon Sep 17 00:00:00 2001 From: Yash Karanke Date: Wed, 29 Sep 2021 21:49:27 +0530 Subject: [PATCH 02/20] Prettier Configuration + Added Prettier Config --- package.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b3c0c4b..088b54f 100644 --- a/package.json +++ b/package.json @@ -40,5 +40,13 @@ "babel-preset-stage-2": "^6.24.1", "babel-register": "^6.26.0", "nodemon": "^2.0.12" + }, + "prettier": { + "trailingComma": "es5", + "tabWidth": 4, + "semi": true, + "singleQuote": false, + "useTabs": true, + "printWidth": 120 } -} +} \ No newline at end of file From 6cb1afeda5eb68c8286bdc57640c55ec1e4e64c3 Mon Sep 17 00:00:00 2001 From: Yash Karanke Date: Wed, 29 Sep 2021 21:50:16 +0530 Subject: [PATCH 03/20] Further Updates + Working on NoSQL Changes + Added NoSQL Code and static method --- controllers/admin.js | 165 ++++++++++++++++----------------- models/product.js | 103 +++++++++++++------- models/user.js | 43 ++++++--- public/js/main.js | 18 ++-- routes/admin.js | 8 +- server.js | 43 +++++---- views/admin/edit-product.ejs | 2 +- views/admin/products.ejs | 4 +- views/includes/add-to-cart.ejs | 6 +- views/includes/navigation.ejs | 92 +++++++++--------- views/shop/product-detail.ejs | 2 +- 11 files changed, 266 insertions(+), 220 deletions(-) diff --git a/controllers/admin.js b/controllers/admin.js index 76645ab..c4f3881 100644 --- a/controllers/admin.js +++ b/controllers/admin.js @@ -1,98 +1,89 @@ const Product = require("../models/product"); exports.getAddProduct = (req, res, next) => { - res.render("admin/edit-product", { - pageTitle: "Add Product", - path: "/admin/add-product", - editing: false, - }); + res.render("admin/edit-product", { + pageTitle: "Add Product", + path: "/admin/add-product", + editing: false, + }); }; exports.postAddProduct = (req, res, next) => { - const title = req.body.title; - const imageUrl = req.body.imageUrl; - const price = req.body.price; - const description = req.body.description; - const product = new Product(title, price, description, imageUrl); - product - .save() - .then((result) => { - // console.log(result); - console.log("Created Product"); - res.redirect("/admin/products"); - }) - .catch((err) => { - console.log(err); - }); + const title = req.body.title; + const imageUrl = req.body.imageUrl; + const price = req.body.price; + const description = req.body.description; + + const product = new Product(title, price, description, imageUrl, null, req.user._id); + product + .save() + .then((result) => { + // console.log(result); + console.log("Created Product"); + res.redirect("/admin/products"); + }) + .catch((err) => { + console.log(err); + }); +}; + +exports.getEditProduct = (req, res, next) => { + const editMode = req.query.edit; + if (!editMode) { + return res.redirect("/"); + } + const prodId = req.params.productId; + Product.findById(prodId) + // Product.findById(prodId) + .then((product) => { + if (!product) { + return res.redirect("/"); + } + res.render("admin/edit-product", { + pageTitle: "Edit Product", + path: "/admin/edit-product", + editing: editMode, + product: product, + }); + }) + .catch((err) => console.log(err)); }; -// exports.getEditProduct = (req, res, next) => { -// const editMode = req.query.edit; -// if (!editMode) { -// return res.redirect('/'); -// } -// const prodId = req.params.productId; -// req.user -// .getProducts({ where: { id: prodId } }) -// // Product.findById(prodId) -// .then(products => { -// const product = products[0]; -// if (!product) { -// return res.redirect('/'); -// } -// res.render('admin/edit-product', { -// pageTitle: 'Edit Product', -// path: '/admin/edit-product', -// editing: editMode, -// product: product -// }); -// }) -// .catch(err => console.log(err)); -// }; +exports.postEditProduct = (req, res, next) => { + const prodId = req.body.productId; + const updatedTitle = req.body.title; + const updatedPrice = req.body.price; + const updatedImageUrl = req.body.imageUrl; + const updatedDesc = req.body.description; -// exports.postEditProduct = (req, res, next) => { -// const prodId = req.body.productId; -// const updatedTitle = req.body.title; -// const updatedPrice = req.body.price; -// const updatedImageUrl = req.body.imageUrl; -// const updatedDesc = req.body.description; -// Product.findById(prodId) -// .then(product => { -// product.title = updatedTitle; -// product.price = updatedPrice; -// product.description = updatedDesc; -// product.imageUrl = updatedImageUrl; -// return product.save(); -// }) -// .then(result => { -// console.log('UPDATED PRODUCT!'); -// res.redirect('/admin/products'); -// }) -// .catch(err => console.log(err)); -// }; + const product = new Product(updatedTitle, updatedPrice, updatedDesc, updatedImageUrl, prodId); + product + .save() + .then((result) => { + console.log("UPDATED PRODUCT!"); + res.redirect("/admin/products"); + }) + .catch((err) => console.log(err)); +}; -// exports.getProducts = (req, res, next) => { -// req.user -// .getProducts() -// .then(products => { -// res.render('admin/products', { -// prods: products, -// pageTitle: 'Admin Products', -// path: '/admin/products' -// }); -// }) -// .catch(err => console.log(err)); -// }; +exports.getProducts = (req, res, next) => { + Product.fetchAll() + .then((products) => { + res.render("admin/products", { + prods: products, + pageTitle: "Admin Products", + path: "/admin/products", + }); + }) + .catch((err) => console.log(err)); +}; -// exports.postDeleteProduct = (req, res, next) => { -// const prodId = req.body.productId; -// Product.findById(prodId) -// .then(product => { -// return product.destroy(); -// }) -// .then(result => { -// console.log('DESTROYED PRODUCT'); -// res.redirect('/admin/products'); -// }) -// .catch(err => console.log(err)); -// }; +exports.postDeleteProduct = (req, res, next) => { + const prodId = req.body.productId; + Product.deleteById(prodId) + .then(() => { + console.log("DESTROYED PRODUCT"); + res.redirect("/admin/products"); + }) + .catch((err) => console.log(err)); +}; diff --git a/models/product.js b/models/product.js index a23681e..55f7a1f 100644 --- a/models/product.js +++ b/models/product.js @@ -2,41 +2,76 @@ const mongodb = require("mongodb"); const getDb = require("../utils/database").getDb; class Product { - constructor(title, price, description, imageUrl) { - this.title = title; - this.price = price; - this.description = description; - this.imageUrl = imageUrl; - } - save() { - const db = getDb(); - return db - .collection("products") - .insertOne(this) - .then((res) => console.log(res)) - .catch((err) => console.error(err)); - } + constructor(title, price, description, imageUrl, id, userId) { + this.title = title; + this.price = price; + this.description = description; + this.imageUrl = imageUrl; + this._id = id ? new mongodb.ObjectId(id) : null; + this.userId = userId; + } - static fetchAll() { - const db = getDb(); - return db - .collection("products") - .find() - .toArray() - .then((res) => { - return res; - }) - .catch((err) => console.log(err)); - } + save() { + const db = getDb(); + let dbOp; + if (this._id) { + // Update the product + dbOp = db + .collection("products") + .updateOne({ _id: this._id }, { $set: this }); + } else { + dbOp = db.collection("products").insertOne(this); + } + return dbOp + .then((result) => { + console.log(result); + }) + .catch((err) => { + console.log(err); + }); + } - static findById(prodId) { - const db = getDb(); - return db - .collection("products") - .find({ _id: new mongodb.ObjectId(prodId) }) - .next() - .then((product) => product) - .catch((err) => console.error(err)); - } + static fetchAll() { + const db = getDb(); + return db + .collection("products") + .find() + .toArray() + .then((products) => { + console.log(products); + return products; + }) + .catch((err) => { + console.log(err); + }); + } + + static findById(prodId) { + const db = getDb(); + return db + .collection("products") + .find({ _id: new mongodb.ObjectId(prodId) }) + .next() + .then((product) => { + return product; + }) + .catch((err) => { + console.log(err); + }); + } + + static deleteById(prodId) { + const db = getDb(); + return db + .collection("products") + .deleteOne({ _id: new mongodb.ObjectId(prodId) }) + .then((result) => { + console.log("Deleted"); + }) + .catch((err) => { + console.log(err); + }); + } } + module.exports = Product; diff --git a/models/user.js b/models/user.js index ce7a26e..fc433ae 100644 --- a/models/user.js +++ b/models/user.js @@ -1,15 +1,32 @@ -const Sequelize = require("sequelize"); -const sequelize = require("../utils/database"); - -const User = sequelize.define("user", { - id: { - type: Sequelize.INTEGER, - autoIncrement: true, - allowNull: false, - primaryKey: true, - }, - name: Sequelize.STRING, - email: Sequelize.STRING, -}); +const mongodb = require("mongodb"); +const getDb = require("../utils/database").getDb; + +const ObjectId = mongodb.ObjectId; + +class User { + constructor(username, email) { + this.name = username; + this.email = email; + } + + save() { + const db = getDb(); + return db.collection("users").insertOne(this); + } + + static findById(userId) { + const db = getDb(); + return db + .collection("users") + .find({ _id: new ObjectId(userId) }) + .next() + .then((user) => { + return user; + }) + .catch((err) => { + console.log(err); + }); + } +} module.exports = User; diff --git a/public/js/main.js b/public/js/main.js index 3d56207..26e2f12 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,16 +1,16 @@ -const backdrop = document.querySelector('.backdrop'); -const sideDrawer = document.querySelector('.mobile-nav'); -const menuToggle = document.querySelector('#side-menu-toggle'); +const backdrop = document.querySelector(".backdrop"); +const sideDrawer = document.querySelector(".mobile-nav"); +const menuToggle = document.querySelector("#side-menu-toggle"); function backdropClickHandler() { - backdrop.style.display = 'none'; - sideDrawer.classList.remove('open'); + backdrop.style.display = "none"; + sideDrawer.classList.remove("open"); } function menuToggleClickHandler() { - backdrop.style.display = 'block'; - sideDrawer.classList.add('open'); + backdrop.style.display = "block"; + sideDrawer.classList.add("open"); } -backdrop.addEventListener('click', backdropClickHandler); -menuToggle.addEventListener('click', menuToggleClickHandler); +backdrop.addEventListener("click", backdropClickHandler); +menuToggle.addEventListener("click", menuToggleClickHandler); diff --git a/routes/admin.js b/routes/admin.js index 5b6f52d..bab323f 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -10,15 +10,15 @@ const router = express.Router(); router.get("/add-product", adminController.getAddProduct); // /admin/products => GET -// router.get("/products", adminController.getProducts); +router.get("/products", adminController.getProducts); // /admin/add-product => POST router.post("/add-product", adminController.postAddProduct); -// router.get("/edit-product/:productId", adminController.getEditProduct); +router.get("/edit-product/:productId", adminController.getEditProduct); -// router.post("/edit-product", adminController.postEditProduct); +router.post("/edit-product", adminController.postEditProduct); -// router.post("/delete-product", adminController.postDeleteProduct); +router.post("/delete-product", adminController.postDeleteProduct); module.exports = router; diff --git a/server.js b/server.js index 936b3af..19a3fd9 100644 --- a/server.js +++ b/server.js @@ -4,7 +4,7 @@ const mongoConnect = require("./utils/database").mongoConnect; const express = require("express"); const bodyParser = require("body-parser"); - +const User = require("./models/user"); const errorController = require("./controllers/error"); const multer = require("multer"); const storage = multer.memoryStorage(); @@ -23,37 +23,36 @@ const shopRoutes = require("./routes/shop"); app.use(bodyParser.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, "public"))); app.use((req, res, next) => { - // User.findByPk(1) - // .then((user) => { - // req.user = user; - // next(); - // }) - // .catch((err) => console.error(err)); - next(); + User.findById("615490961edaa81fdda5f2c7") + .then((user) => { + req.user = user; + next(); + }) + .catch((err) => console.log(err)); }); app.use("/admin", adminRoutes); app.use(shopRoutes); app.post("/api/v1/images", uploads.single("thumbnail"), async (req, res) => { - console.log("file", req.file); - console.log("body", req.body); - fs.access("./data/uploads/", (err) => { - if (err) { - fs.mkdirSync("./data/uploads"); - } - }); - await sharp(req.file.buffer) - .resize({ width: 650, height: 350 }) - .toFile("./data/uploads/" + req.file.originalname); - res.send("success"); + console.log("file", req.file); + console.log("body", req.body); + fs.access("./data/uploads/", (err) => { + if (err) { + fs.mkdirSync("./data/uploads"); + } + }); + await sharp(req.file.buffer) + .resize({ width: 650, height: 350 }) + .toFile("./data/uploads/" + req.file.originalname); + res.send("success"); }); app.use(errorController.get404); const port = process.env.PORT || 5000; mongoConnect(() => { - app.listen(port, () => { - console.log(`server is running on ${port}`); - }); + app.listen(port, () => { + console.log(`server is running on ${port}`); + }); }); diff --git a/views/admin/edit-product.ejs b/views/admin/edit-product.ejs index fa19db1..87098b8 100644 --- a/views/admin/edit-product.ejs +++ b/views/admin/edit-product.ejs @@ -25,7 +25,7 @@ <% if (editing) { %> - + <% } %> diff --git a/views/admin/products.ejs b/views/admin/products.ejs index 6a221a0..1919efb 100644 --- a/views/admin/products.ejs +++ b/views/admin/products.ejs @@ -27,9 +27,9 @@

- Edit + Edit
- +
diff --git a/views/includes/add-to-cart.ejs b/views/includes/add-to-cart.ejs index 8320fe9..164a2d4 100644 --- a/views/includes/add-to-cart.ejs +++ b/views/includes/add-to-cart.ejs @@ -1,4 +1,4 @@
- - -
+ + + \ No newline at end of file diff --git a/views/includes/navigation.ejs b/views/includes/navigation.ejs index a8b7e57..974ac6d 100644 --- a/views/includes/navigation.ejs +++ b/views/includes/navigation.ejs @@ -1,49 +1,53 @@
- - + +
+ + \ No newline at end of file diff --git a/views/shop/product-detail.ejs b/views/shop/product-detail.ejs index 22cbf46..bbf5c63 100644 --- a/views/shop/product-detail.ejs +++ b/views/shop/product-detail.ejs @@ -9,7 +9,7 @@
<%= product.title %>
-

$<%= product.price %>

+

<%= product.price %>

<%= product.description %>

<%- include('../includes/add-to-cart.ejs') %> From ae38aecf650acffbbbe909d0545c620a0dd8e27a Mon Sep 17 00:00:00 2001 From: Yash Karanke Date: Thu, 30 Sep 2021 22:15:21 +0530 Subject: [PATCH 04/20] Working on Cart --- .babelrc | 3 + controllers/shop.js | 265 +++++++++++++++++++++----------------------- models/cart.js | 13 --- models/cartItem.js | 14 --- models/product.js | 130 +++++++++++----------- models/user.js | 56 ++++++---- package-lock.json | 12 +- package.json | 2 +- 8 files changed, 237 insertions(+), 258 deletions(-) create mode 100644 .babelrc delete mode 100644 models/cart.js delete mode 100644 models/cartItem.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..53d1283 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["env", "stage-0"] +} diff --git a/controllers/shop.js b/controllers/shop.js index 7de9fb6..8cfb1bf 100644 --- a/controllers/shop.js +++ b/controllers/shop.js @@ -1,163 +1,154 @@ const Product = require("../models/product"); exports.getProducts = (req, res, next) => { - Product.fetchAll() - .then((products) => { - res.render("shop/product-list", { - prods: products, - pageTitle: "All Products", - path: "/products", - }); - }) - .catch((err) => { - console.log(err); - }); + Product.fetchAll() + .then((products) => { + res.render("shop/product-list", { + prods: products, + pageTitle: "All Products", + path: "/products", + }); + }) + .catch((err) => { + console.log(err); + }); }; exports.getProduct = (req, res, next) => { - const prodId = req.params.productId; - // Product.findAll({ where: { id: prodId } }) - // .then(products => { - // res.render('shop/product-detail', { - // product: products[0], - // pageTitle: products[0].title, - // path: '/products' - // }); - // }) - // .catch(err => console.log(err)); - Product.findById(prodId) - .then((product) => { - res.render("shop/product-detail", { - product: product, - pageTitle: product.title, - path: "/products", - }); - }) - .catch((err) => console.log(err)); + const prodId = req.params.productId; + Product.findById(prodId) + .then((product) => { + res.render("shop/product-detail", { + product: product, + pageTitle: product.title, + path: "/products", + }); + }) + .catch((err) => console.log(err)); }; exports.getIndex = (req, res, next) => { - Product.fetchAll() - .then((products) => { - res.render("shop/index", { - prods: products, - pageTitle: "Shop", - path: "/", - }); - }) - .catch((err) => { - console.log(err); - }); + Product.fetchAll() + .then((products) => { + res.render("shop/index", { + prods: products, + pageTitle: "Shop", + path: "/", + }); + }) + .catch((err) => { + console.log(err); + }); }; exports.getCart = (req, res, next) => { - req.user - .getCart() - .then((cart) => { - return cart - .getProducts() - .then((products) => { - res.render("shop/cart", { - path: "/cart", - pageTitle: "Your Cart", - products: products, - }); - }) - .catch((err) => console.log(err)); - }) - .catch((err) => console.log(err)); + req.user + .getCart() + .then((cart) => { + return cart + .getProducts() + .then((products) => { + res.render("shop/cart", { + path: "/cart", + pageTitle: "Your Cart", + products: products, + }); + }) + .catch((err) => console.log(err)); + }) + .catch((err) => console.log(err)); }; exports.postCart = (req, res, next) => { - const prodId = req.body.productId; - let fetchedCart; - let newQuantity = 1; - req.user - .getCart() - .then((cart) => { - fetchedCart = cart; - return cart.getProducts({ where: { id: prodId } }); - }) - .then((products) => { - let product; - if (products.length > 0) { - product = products[0]; - } + const prodId = req.body.productId; + let fetchedCart; + let newQuantity = 1; + req.user + .getCart() + .then((cart) => { + fetchedCart = cart; + return cart.getProducts({ where: { id: prodId } }); + }) + .then((products) => { + let product; + if (products.length > 0) { + product = products[0]; + } - if (product) { - const oldQuantity = product.cartItem.quantity; - newQuantity = oldQuantity + 1; - return product; - } - return Product.findById(prodId); - }) - .then((product) => { - return fetchedCart.addProduct(product, { - through: { quantity: newQuantity }, - }); - }) - .then(() => { - res.redirect("/cart"); - }) - .catch((err) => console.log(err)); + if (product) { + const oldQuantity = product.cartItem.quantity; + newQuantity = oldQuantity + 1; + return product; + } + return Product.findById(prodId); + }) + .then((product) => { + return fetchedCart.addProduct(product, { + through: { quantity: newQuantity }, + }); + }) + .then(() => { + res.redirect("/cart"); + }) + .catch((err) => console.log(err)); }; exports.postCartDeleteProduct = (req, res, next) => { - const prodId = req.body.productId; - req.user - .getCart() - .then((cart) => { - return cart.getProducts({ where: { id: prodId } }); - }) - .then((products) => { - const product = products[0]; - return product.cartItem.destroy(); - }) - .then((result) => { - res.redirect("/cart"); - }) - .catch((err) => console.log(err)); + const prodId = req.body.productId; + req.user + .getCart() + .then((cart) => { + return cart.getProducts({ where: { id: prodId } }); + }) + .then((products) => { + const product = products[0]; + return product.cartItem.destroy(); + }) + .then((result) => { + res.redirect("/cart"); + }) + .catch((err) => console.log(err)); }; exports.postOrder = (req, res, next) => { - let fetchedCart; - req.user - .getCart() - .then((cart) => { - fetchedCart = cart; - return cart.getProducts(); - }) - .then((products) => { - return req.user - .createOrder() - .then((order) => { - return order.addProducts( - products.map((product) => { - product.orderItem = { quantity: product.cartItem.quantity }; - return product; - }) - ); - }) - .catch((err) => console.log(err)); - }) - .then((result) => { - return fetchedCart.setProducts(null); - }) - .then((result) => { - res.redirect("/orders"); - }) - .catch((err) => console.log(err)); + let fetchedCart; + req.user + .getCart() + .then((cart) => { + fetchedCart = cart; + return cart.getProducts(); + }) + .then((products) => { + return req.user + .createOrder() + .then((order) => { + return order.addProducts( + products.map((product) => { + product.orderItem = { quantity: product.cartItem.quantity }; + return product; + }) + ); + }) + .catch((err) => console.log(err)); + }) + .then((result) => { + return fetchedCart.setProducts(null); + }) + .then((result) => { + res.redirect("/orders"); + }) + .catch((err) => console.log(err)); }; exports.getOrders = (req, res, next) => { - req.user - .getOrders({ include: ["products"] }) - .then((orders) => { - res.render("shop/orders", { - path: "/orders", - pageTitle: "Your Orders", - orders: orders, - }); - }) - .catch((err) => console.log(err)); + req.user + .getOrders({ include: ["products"] }) + .then((orders) => { + res.render("shop/orders", { + path: "/orders", + pageTitle: "Your Orders", + orders: orders, + }); + }) + .catch((err) => console.log(err)); }; diff --git a/models/cart.js b/models/cart.js deleted file mode 100644 index d18e0b8..0000000 --- a/models/cart.js +++ /dev/null @@ -1,13 +0,0 @@ -const Sequelize = require("sequelize"); -const sequelize = require("../utils/database"); - -const Cart = sequelize.define("cart", { - id: { - type: Sequelize.INTEGER, - autoIncrement: true, - allowNull: false, - primaryKey: true, - }, -}); - -module.exports = Cart; diff --git a/models/cartItem.js b/models/cartItem.js deleted file mode 100644 index 876831a..0000000 --- a/models/cartItem.js +++ /dev/null @@ -1,14 +0,0 @@ -const Sequelize = require("sequelize"); -const sequelize = require("../utils/database"); - -const CartItem = sequelize.define("cartItem", { - id: { - type: Sequelize.INTEGER, - autoIncrement: true, - allowNull: false, - primaryKey: true, - }, - quantity: Sequelize.INTEGER, -}); - -module.exports = CartItem; diff --git a/models/product.js b/models/product.js index 55f7a1f..ffbbce7 100644 --- a/models/product.js +++ b/models/product.js @@ -2,76 +2,74 @@ const mongodb = require("mongodb"); const getDb = require("../utils/database").getDb; class Product { - constructor(title, price, description, imageUrl, id, userId) { - this.title = title; - this.price = price; - this.description = description; - this.imageUrl = imageUrl; - this._id = id ? new mongodb.ObjectId(id) : null; - this.userId = userId; - } + constructor(title, price, description, imageUrl, id, userId) { + this.title = title; + this.price = price; + this.description = description; + this.imageUrl = imageUrl; + this._id = id ? new mongodb.ObjectId(id) : null; + this.userId = userId; + } - save() { - const db = getDb(); - let dbOp; - if (this._id) { - // Update the product - dbOp = db - .collection("products") - .updateOne({ _id: this._id }, { $set: this }); - } else { - dbOp = db.collection("products").insertOne(this); - } - return dbOp - .then((result) => { - console.log(result); - }) - .catch((err) => { - console.log(err); - }); - } + save() { + const db = getDb(); + let dbOp; + if (this._id) { + // Update the product + dbOp = db.collection("products").updateOne({ _id: this._id }, { $set: this }); + } else { + dbOp = db.collection("products").insertOne(this); + } + return dbOp + .then((result) => { + console.log(result); + }) + .catch((err) => { + console.log(err); + }); + } - static fetchAll() { - const db = getDb(); - return db - .collection("products") - .find() - .toArray() - .then((products) => { - console.log(products); - return products; - }) - .catch((err) => { - console.log(err); - }); - } + static fetchAll() { + const db = getDb(); + return db + .collection("products") + .find() + .toArray() + .then((products) => { + console.log(products); + return products; + }) + .catch((err) => { + console.log(err); + }); + } - static findById(prodId) { - const db = getDb(); - return db - .collection("products") - .find({ _id: new mongodb.ObjectId(prodId) }) - .next() - .then((product) => { - return product; - }) - .catch((err) => { - console.log(err); - }); - } + static findById(prodId) { + const db = getDb(); + return db + .collection("products") + .find({ _id: new mongodb.ObjectId(prodId) }) + .next() + .then((product) => { + return product; + }) + .catch((err) => { + console.log(err); + }); + } - static deleteById(prodId) { - const db = getDb(); - return db - .collection("products") - .deleteOne({ _id: new mongodb.ObjectId(prodId) }) - .then((result) => { - console.log("Deleted"); - }) - .catch((err) => { - console.log(err); - }); - } + static deleteById(prodId) { + const db = getDb(); + return db + .collection("products") + .deleteOne({ _id: new mongodb.ObjectId(prodId) }) + .then((result) => { + console.log("Deleted"); + }) + .catch((err) => { + console.log(err); + }); + } } module.exports = Product; diff --git a/models/user.js b/models/user.js index fc433ae..a6fc273 100644 --- a/models/user.js +++ b/models/user.js @@ -4,29 +4,43 @@ const getDb = require("../utils/database").getDb; const ObjectId = mongodb.ObjectId; class User { - constructor(username, email) { - this.name = username; - this.email = email; - } + constructor(username, email, cart, id) { + this.name = username; + this.email = email; + this.cart = cart; + this._id = id; + } - save() { - const db = getDb(); - return db.collection("users").insertOne(this); - } + save() { + const db = getDb(); + return db.collection("users").insertOne(this); + } - static findById(userId) { - const db = getDb(); - return db - .collection("users") - .find({ _id: new ObjectId(userId) }) - .next() - .then((user) => { - return user; - }) - .catch((err) => { - console.log(err); - }); - } + addToCart(product) { + // const cartProduct = this.cart.items.findIndex(cp=>{ + // return cp._id === product._id + // }) + + const updatedCart = { items: [{ ...product, quantity: 1 }] }; + const db = getDb(); + return db + .collection("users") + .updateOne({ _id: new mongodb.ObjectId(this._id) }, { $set: { cart: updatedCart } }); + } + + static findById(userId) { + const db = getDb(); + return db + .collection("users") + .find({ _id: new ObjectId(userId) }) + .next() + .then((user) => { + return user; + }) + .catch((err) => { + console.log(err); + }); + } } module.exports = User; diff --git a/package-lock.json b/package-lock.json index 5a615ba..fecc591 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1910,9 +1910,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001252", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", - "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", + "version": "1.0.30001261", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", + "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==", "dev": true }, "chalk": { @@ -2407,9 +2407,9 @@ } }, "electron-to-chromium": { - "version": "1.3.820", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.820.tgz", - "integrity": "sha512-5cFwDmo2yzEA9hn55KZ9+cX/b6DSFvpKz8Hb2fiDmriXWB+DBoXKXmncQwNRFBBTlUdsvPHCoy594OoMLAO0Tg==", + "version": "1.3.853", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.853.tgz", + "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==", "dev": true }, "emoji-regex": { diff --git a/package.json b/package.json index 088b54f..6047cb1 100644 --- a/package.json +++ b/package.json @@ -49,4 +49,4 @@ "useTabs": true, "printWidth": 120 } -} \ No newline at end of file +} From bfadb725853c814c343b1b60c0a26dee96a81919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Migeat?= <44432694+STM3900@users.noreply.github.com> Date: Sat, 2 Oct 2021 15:18:06 +0200 Subject: [PATCH 05/20] add translation to fix #11 --- translations.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 translations.md diff --git a/translations.md b/translations.md new file mode 100644 index 0000000..1d9666d --- /dev/null +++ b/translations.md @@ -0,0 +1,29 @@ +#Translations : English to French + + +##edit-products.ejs +* line 12 : Title -> Titre +* line 16 : Image URL -> URL de l'image +* line 20 : Price -> Prix +* line 24 : Description -> Description +* line 31 : Update Product - Add Product -> Mettre à jour l'article - Ajouter un article + +##products.ejs +* line 30 : Edit -> Modifier +* line 33 : Delete -> Supprimer +* line 41 : No Products Found! -> Aucun produits trouvé ! + +##add-to-cart.ejs +* line 2 : Ajouter au panier + +##navigation.ejs +* line 7 : Shop -> Boutique +* line 10 : Products -> Articles +* line 13 : Cart -> Panier +* line 16 : Orders -> Commandes +* line 19 : Add Product -> Ajouter un article +* line 23 : Admin Products -> Articles admin + +##404.ejs + +* line 6 : Page Not Found! -> Page introuvable ! \ No newline at end of file From 9918b26a439c1725057c1fc1c7736d2f0bdd5719 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Sun, 3 Oct 2021 00:53:57 +0530 Subject: [PATCH 06/20] language #11 + working on the dynamic translations --- package-lock.json | 171 ++++++++++++++++++++++++++++ package.json | 4 + server.js | 46 ++++---- src/app/language.js | 22 ++++ src/app/locales/en/translation.json | 5 + src/app/locales/fr/translation.json | 5 + utils/database.js | 33 +++--- 7 files changed, 245 insertions(+), 41 deletions(-) create mode 100644 src/app/language.js create mode 100644 src/app/locales/en/translation.json create mode 100644 src/app/locales/fr/translation.json diff --git a/package-lock.json b/package-lock.json index fecc591..44242b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,21 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" }, + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + } + } + }, "@babel/types": { "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", @@ -242,6 +257,21 @@ "readable-stream": "^2.0.6" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + } + } + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -2160,6 +2190,15 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookies": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.1.tgz", + "integrity": "sha1-fIphX1SBxhq58WyDNzG8uPZjuZs=", + "requires": { + "depd": "~1.1.1", + "keygrip": "~1.0.2" + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2463,6 +2502,11 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3185,6 +3229,69 @@ "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", "integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=" }, + "i18n": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.13.3.tgz", + "integrity": "sha512-QDmY2joBdKxj3wvk2LKyvZkjwGHta882kYHwEvx1WbwiPAet49kEU7cxzGfnrtWrfh4+7I07kBc0ZSjSlhnKyQ==", + "requires": { + "debug": "^4.1.1", + "make-plural": "^6.2.2", + "math-interval-parser": "^2.0.1", + "messageformat": "^2.3.0", + "mustache": "^4.0.1", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "i18next": { + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.2.3.tgz", + "integrity": "sha512-aOYql7b9dvcSlkp9mDBFiLPv3+3TVAbXM06lgGL8xWCf5yd0QlgQvvvyCin24WR4EMl4eiu+vijKdblYKs3kfw==", + "requires": { + "@babel/runtime": "^7.12.0" + } + }, + "i18next-express-middleware": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/i18next-express-middleware/-/i18next-express-middleware-2.0.0.tgz", + "integrity": "sha512-TGlSkYsQHikggv4mIp5B+CiXsZzwbpHaZgmOkRNGStLOdKHABH5cHr136g2PC1+p2VPMf3y3UoQZ1TfPfVOrgg==", + "requires": { + "cookies": "0.7.1" + } + }, + "i18next-node-fs-backend": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/i18next-node-fs-backend/-/i18next-node-fs-backend-2.1.3.tgz", + "integrity": "sha512-CreMFiVl3ChlMc5ys/e0QfuLFOZyFcL40Jj6jaKD6DxZ/GCUMxPI9BpU43QMWUgC7r+PClpxg2cGXAl0CjG04g==", + "requires": { + "js-yaml": "3.13.1", + "json5": "2.0.0" + }, + "dependencies": { + "json5": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.0.0.tgz", + "integrity": "sha512-0EdQvHuLm7yJ7lyG5dp7Q3X2ku++BG5ZHaJ5FTnaXpKqDrw4pMxel5Bt3oAYMthnrthFBdnZ1FcsXTPyrQlV0w==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3571,6 +3678,15 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -3603,6 +3719,11 @@ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" }, + "keygrip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", + "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" + }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -3680,6 +3801,11 @@ } } }, + "make-plural": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz", + "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==" + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3697,6 +3823,11 @@ "object-visit": "^1.0.0" } }, + "math-interval-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", + "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==" + }, "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", @@ -3720,6 +3851,36 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "messageformat": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", + "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", + "requires": { + "make-plural": "^4.3.0", + "messageformat-formatters": "^2.0.1", + "messageformat-parser": "^4.1.2" + }, + "dependencies": { + "make-plural": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", + "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "messageformat-formatters": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", + "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==" + }, + "messageformat-parser": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.3.tgz", + "integrity": "sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg==" + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -3993,6 +4154,11 @@ "xtend": "^4.0.0" } }, + "mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + }, "mysql2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.0.tgz", @@ -5346,6 +5512,11 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", diff --git a/package.json b/package.json index 6047cb1..228f2b2 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,10 @@ "graphql-tools": "^8.1.0", "http": "0.0.1-security", "https": "^1.0.0", + "i18n": "^0.13.3", + "i18next": "^21.2.3", + "i18next-express-middleware": "^2.0.0", + "i18next-node-fs-backend": "^2.1.3", "mongodb": "^4.1.2", "mongoose": "^6.0.7", "multer": "^1.4.3", diff --git a/server.js b/server.js index 19a3fd9..b6c4dd8 100644 --- a/server.js +++ b/server.js @@ -1,7 +1,7 @@ const path = require("path"); // const User = require("./models/user"); const mongoConnect = require("./utils/database").mongoConnect; - +const port = process.env.PORT || 5000; const express = require("express"); const bodyParser = require("body-parser"); const User = require("./models/user"); @@ -11,9 +11,7 @@ const storage = multer.memoryStorage(); const uploads = multer({ storage }); const sharp = require("sharp"); const fs = require("fs"); - const app = express(); - app.set("view engine", "ejs"); app.set("views", path.join(__dirname, "views")); @@ -23,36 +21,34 @@ const shopRoutes = require("./routes/shop"); app.use(bodyParser.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, "public"))); app.use((req, res, next) => { - User.findById("615490961edaa81fdda5f2c7") - .then((user) => { - req.user = user; - next(); - }) - .catch((err) => console.log(err)); + User.findById("615490961edaa81fdda5f2c7") + .then((user) => { + req.user = user; + next(); + }) + .catch((err) => console.log(err)); }); app.use("/admin", adminRoutes); app.use(shopRoutes); - app.post("/api/v1/images", uploads.single("thumbnail"), async (req, res) => { - console.log("file", req.file); - console.log("body", req.body); - fs.access("./data/uploads/", (err) => { - if (err) { - fs.mkdirSync("./data/uploads"); - } - }); - await sharp(req.file.buffer) - .resize({ width: 650, height: 350 }) - .toFile("./data/uploads/" + req.file.originalname); - res.send("success"); + console.log("file", req.file); + console.log("body", req.body); + fs.access("./data/uploads/", (err) => { + if (err) { + fs.mkdirSync("./data/uploads"); + } + }); + await sharp(req.file.buffer) + .resize({ width: 650, height: 350 }) + .toFile("./data/uploads/" + req.file.originalname); + res.send("success"); }); app.use(errorController.get404); -const port = process.env.PORT || 5000; mongoConnect(() => { - app.listen(port, () => { - console.log(`server is running on ${port}`); - }); + app.listen(port, () => { + console.log(`server is running on ${port}`); + }); }); diff --git a/src/app/language.js b/src/app/language.js new file mode 100644 index 0000000..82194d9 --- /dev/null +++ b/src/app/language.js @@ -0,0 +1,22 @@ +const i18next = require("i18next"); +const i18nextMiddleware = require("i18next-express-middleware"); +const Backend = require("i18next-node-fs-backend"); + +i18next + .use(i18nextMiddleware.LanguageDetector) + .use(Backend) + .init({ + backend: { + loadPath: __dirname + "/locales/{{lng}}/{{ns}}.json", + }, + debug: false, + detection: { + order: ["querystring", "cookie"], + caches: ["cookie"], + }, + + preload: ["en", "fr"], + saveMissing: true, + }); + +module.exports = i18nextMiddleware.handle(i18next); diff --git a/src/app/locales/en/translation.json b/src/app/locales/en/translation.json new file mode 100644 index 0000000..0eb368b --- /dev/null +++ b/src/app/locales/en/translation.json @@ -0,0 +1,5 @@ +{ + "errors": { + "invalid": "Invalid" + } +} \ No newline at end of file diff --git a/src/app/locales/fr/translation.json b/src/app/locales/fr/translation.json new file mode 100644 index 0000000..da18ffb --- /dev/null +++ b/src/app/locales/fr/translation.json @@ -0,0 +1,5 @@ +{ + "errors": { + "invalid": "Invaleed" + } +} \ No newline at end of file diff --git a/utils/database.js b/utils/database.js index abe4863..7aa43cd 100644 --- a/utils/database.js +++ b/utils/database.js @@ -4,25 +4,26 @@ const MongoClient = mongodb.MongoClient; let _db; const mongoConnect = (callback) => { - MongoClient.connect("mongodb+srv://karankeyash:5iQjbOd5VsALNtKL@core-server-nosql.62k6j.mongodb.net/shop?retryWrites=true&w=majority") - .then((client) => { - _db = client.db(""); - console.log("Connected"); - callback(); - }) - .catch((err) => { - console.error(err); - throw new Error("An Error Occured"); - }); + MongoClient.connect( + "mongodb+srv://karankeyash:5iQjbOd5VsALNtKL@core-server-nosql.62k6j.mongodb.net/shop?retryWrites=true&w=majority" + ) + .then((client) => { + _db = client.db(""); + console.log("Connected"); + callback(); + }) + .catch((err) => { + console.error(err); + throw new Error("An Error Occured"); + }); }; const getDb = () => { - if (_db) { - return _db; - } else { - throw new Error("No Database found"); - } + if (_db) { + return _db; + } else { + throw new Error("No Database found"); + } }; - exports.mongoConnect = mongoConnect; exports.getDb = getDb; From 23a0a23301c153fb158817b7df44638b29ec1f53 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Sun, 3 Oct 2021 01:03:44 +0530 Subject: [PATCH 07/20] #11 Working on Languages --- src/app/language.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/language.js b/src/app/language.js index 82194d9..8b1277a 100644 --- a/src/app/language.js +++ b/src/app/language.js @@ -14,9 +14,9 @@ i18next order: ["querystring", "cookie"], caches: ["cookie"], }, - preload: ["en", "fr"], saveMissing: true, + fallBackLng: ["en"], }); module.exports = i18nextMiddleware.handle(i18next); From 114b2d6fdb7630e53305d28f05c76b71b3ab29a3 Mon Sep 17 00:00:00 2001 From: nkhandelwal07 <91761839+nkhandelwal07@users.noreply.github.com> Date: Mon, 4 Oct 2021 17:40:13 -0700 Subject: [PATCH 08/20] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 354125d..1b903fa 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ # core-server [![wakatime](https://wakatime.com/badge/github/dextel2/core-server.svg)](https://wakatime.com/badge/github/dextel2/core-server) + +# Project +## Template Usage +1. This is a boilerplate project, which means anyone can use it as a template. +1. This is a build upon MySQL and MongoDB, meaning you can build your project using this as your template. +## User Interface +1. The user interface for this project is very simple! +1. The idea is to use [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete)(Create, Read, Update and Delete) operators in a simple way. From efa7929e81d58b49ca8fad4bce459911ac2dffa6 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:32:17 +0530 Subject: [PATCH 09/20] Changed the project structure --- models/user.js | 46 ----------- package-lock.json | 6 +- package.json | 2 +- server.js | 19 +++-- src/app/language.js | 22 ----- {controllers => src/controllers}/admin.js | 0 {controllers => src/controllers}/error.js | 0 {controllers => src/controllers}/shop.js | 51 +++--------- {data => src/data}/cart.json | 0 {data => src/data}/products.json | 0 {data => src/data}/uploads/Capture.PNG | Bin .../photo-1583912372139-6a46eb6eb119.jfif | Bin src/language.js | 18 ++++ src/{app => }/locales/en/translation.json | 0 src/{app => }/locales/fr/translation.json | 0 {models => src/models}/order.js | 0 {models => src/models}/orderItems.js | 0 {models => src/models}/product.js | 0 src/models/user.js | 78 ++++++++++++++++++ {public => src/public}/css/cart.css | 0 {public => src/public}/css/forms.css | 0 {public => src/public}/css/main.css | 0 {public => src/public}/css/product.css | 0 {public => src/public}/js/main.js | 0 {routes => src/routes}/admin.js | 2 - {routes => src/routes}/shop.js | 4 +- translations.md => src/translations.md | 0 {utils => src/utils}/database.js | 0 {utils => src/utils}/db.config.js | 0 {utils => src/utils}/path.js | 0 {views => src/views}/404.ejs | 0 {views => src/views}/admin/edit-product.ejs | 0 {views => src/views}/admin/products.ejs | 0 src/views/includes/add-to-cart.ejs | 4 + {views => src/views}/includes/end.ejs | 0 {views => src/views}/includes/head.ejs | 0 {views => src/views}/includes/navigation.ejs | 0 {views => src/views}/shop/cart.ejs | 4 +- {views => src/views}/shop/checkout.ejs | 0 {views => src/views}/shop/index.ejs | 0 {views => src/views}/shop/orders.ejs | 0 {views => src/views}/shop/product-detail.ejs | 0 {views => src/views}/shop/product-list.ejs | 0 views/includes/add-to-cart.ejs | 4 - 44 files changed, 130 insertions(+), 130 deletions(-) delete mode 100644 models/user.js delete mode 100644 src/app/language.js rename {controllers => src/controllers}/admin.js (100%) rename {controllers => src/controllers}/error.js (100%) rename {controllers => src/controllers}/shop.js (74%) rename {data => src/data}/cart.json (100%) rename {data => src/data}/products.json (100%) rename {data => src/data}/uploads/Capture.PNG (100%) rename {data => src/data}/uploads/photo-1583912372139-6a46eb6eb119.jfif (100%) create mode 100644 src/language.js rename src/{app => }/locales/en/translation.json (100%) rename src/{app => }/locales/fr/translation.json (100%) rename {models => src/models}/order.js (100%) rename {models => src/models}/orderItems.js (100%) rename {models => src/models}/product.js (100%) create mode 100644 src/models/user.js rename {public => src/public}/css/cart.css (100%) rename {public => src/public}/css/forms.css (100%) rename {public => src/public}/css/main.css (100%) rename {public => src/public}/css/product.css (100%) rename {public => src/public}/js/main.js (100%) rename {routes => src/routes}/admin.js (95%) rename {routes => src/routes}/shop.js (83%) rename translations.md => src/translations.md (100%) rename {utils => src/utils}/database.js (100%) rename {utils => src/utils}/db.config.js (100%) rename {utils => src/utils}/path.js (100%) rename {views => src/views}/404.ejs (100%) rename {views => src/views}/admin/edit-product.ejs (100%) rename {views => src/views}/admin/products.ejs (100%) create mode 100644 src/views/includes/add-to-cart.ejs rename {views => src/views}/includes/end.ejs (100%) rename {views => src/views}/includes/head.ejs (100%) rename {views => src/views}/includes/navigation.ejs (100%) rename {views => src/views}/shop/cart.ejs (92%) rename {views => src/views}/shop/checkout.ejs (100%) rename {views => src/views}/shop/index.ejs (100%) rename {views => src/views}/shop/orders.ejs (100%) rename {views => src/views}/shop/product-detail.ejs (100%) rename {views => src/views}/shop/product-list.ejs (100%) delete mode 100644 views/includes/add-to-cart.ejs diff --git a/models/user.js b/models/user.js deleted file mode 100644 index a6fc273..0000000 --- a/models/user.js +++ /dev/null @@ -1,46 +0,0 @@ -const mongodb = require("mongodb"); -const getDb = require("../utils/database").getDb; - -const ObjectId = mongodb.ObjectId; - -class User { - constructor(username, email, cart, id) { - this.name = username; - this.email = email; - this.cart = cart; - this._id = id; - } - - save() { - const db = getDb(); - return db.collection("users").insertOne(this); - } - - addToCart(product) { - // const cartProduct = this.cart.items.findIndex(cp=>{ - // return cp._id === product._id - // }) - - const updatedCart = { items: [{ ...product, quantity: 1 }] }; - const db = getDb(); - return db - .collection("users") - .updateOne({ _id: new mongodb.ObjectId(this._id) }, { $set: { cart: updatedCart } }); - } - - static findById(userId) { - const db = getDb(); - return db - .collection("users") - .find({ _id: new ObjectId(userId) }) - .next() - .then((user) => { - return user; - }) - .catch((err) => { - console.log(err); - }); - } -} - -module.exports = User; diff --git a/package-lock.json b/package-lock.json index 44242b0..e4d0177 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3258,9 +3258,9 @@ } }, "i18next": { - "version": "21.2.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.2.3.tgz", - "integrity": "sha512-aOYql7b9dvcSlkp9mDBFiLPv3+3TVAbXM06lgGL8xWCf5yd0QlgQvvvyCin24WR4EMl4eiu+vijKdblYKs3kfw==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.2.4.tgz", + "integrity": "sha512-+81XmiwJOLWJFjRZJK5ASFahAo5TXZGz5IrBT4CfLJ3CyXho61A1cj1Kmh8za8TYtGFou0cEkUSjEaqfya7Wfg==", "requires": { "@babel/runtime": "^7.12.0" } diff --git a/package.json b/package.json index 228f2b2..64bca92 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "http": "0.0.1-security", "https": "^1.0.0", "i18n": "^0.13.3", - "i18next": "^21.2.3", + "i18next": "^21.2.4", "i18next-express-middleware": "^2.0.0", "i18next-node-fs-backend": "^2.1.3", "mongodb": "^4.1.2", diff --git a/server.js b/server.js index b6c4dd8..d76cdcb 100644 --- a/server.js +++ b/server.js @@ -1,29 +1,30 @@ const path = require("path"); -// const User = require("./models/user"); -const mongoConnect = require("./utils/database").mongoConnect; +const mongoConnect = require("./src/utils/database").mongoConnect; const port = process.env.PORT || 5000; const express = require("express"); const bodyParser = require("body-parser"); -const User = require("./models/user"); -const errorController = require("./controllers/error"); +const User = require("./src/models/user"); +const errorController = require("./src/controllers/error"); const multer = require("multer"); const storage = multer.memoryStorage(); const uploads = multer({ storage }); const sharp = require("sharp"); const fs = require("fs"); const app = express(); + app.set("view engine", "ejs"); -app.set("views", path.join(__dirname, "views")); +app.set("views", path.join(__dirname, "/src/views")); -const adminRoutes = require("./routes/admin"); -const shopRoutes = require("./routes/shop"); +const adminRoutes = require("./src/routes/admin"); +const shopRoutes = require("./src/routes/shop"); app.use(bodyParser.urlencoded({ extended: false })); -app.use(express.static(path.join(__dirname, "public"))); +app.use(express.static(path.join(__dirname, "/src/public"))); + app.use((req, res, next) => { User.findById("615490961edaa81fdda5f2c7") .then((user) => { - req.user = user; + req.user = new User(user.name, user.email, user.cart, user._id); next(); }) .catch((err) => console.log(err)); diff --git a/src/app/language.js b/src/app/language.js deleted file mode 100644 index 8b1277a..0000000 --- a/src/app/language.js +++ /dev/null @@ -1,22 +0,0 @@ -const i18next = require("i18next"); -const i18nextMiddleware = require("i18next-express-middleware"); -const Backend = require("i18next-node-fs-backend"); - -i18next - .use(i18nextMiddleware.LanguageDetector) - .use(Backend) - .init({ - backend: { - loadPath: __dirname + "/locales/{{lng}}/{{ns}}.json", - }, - debug: false, - detection: { - order: ["querystring", "cookie"], - caches: ["cookie"], - }, - preload: ["en", "fr"], - saveMissing: true, - fallBackLng: ["en"], - }); - -module.exports = i18nextMiddleware.handle(i18next); diff --git a/controllers/admin.js b/src/controllers/admin.js similarity index 100% rename from controllers/admin.js rename to src/controllers/admin.js diff --git a/controllers/error.js b/src/controllers/error.js similarity index 100% rename from controllers/error.js rename to src/controllers/error.js diff --git a/controllers/shop.js b/src/controllers/shop.js similarity index 74% rename from controllers/shop.js rename to src/controllers/shop.js index 8cfb1bf..adc560e 100644 --- a/controllers/shop.js +++ b/src/controllers/shop.js @@ -44,53 +44,26 @@ exports.getIndex = (req, res, next) => { exports.getCart = (req, res, next) => { req.user .getCart() - .then((cart) => { - return cart - .getProducts() - .then((products) => { - res.render("shop/cart", { - path: "/cart", - pageTitle: "Your Cart", - products: products, - }); - }) - .catch((err) => console.log(err)); + .then((products) => { + res.render("shop/cart", { + path: "/cart", + pageTitle: "Your Cart", + products, + }); }) .catch((err) => console.log(err)); }; exports.postCart = (req, res, next) => { const prodId = req.body.productId; - let fetchedCart; - let newQuantity = 1; - req.user - .getCart() - .then((cart) => { - fetchedCart = cart; - return cart.getProducts({ where: { id: prodId } }); - }) - .then((products) => { - let product; - if (products.length > 0) { - product = products[0]; - } - - if (product) { - const oldQuantity = product.cartItem.quantity; - newQuantity = oldQuantity + 1; - return product; - } - return Product.findById(prodId); - }) + console.log(req.user); + Product.findById(prodId) .then((product) => { - return fetchedCart.addProduct(product, { - through: { quantity: newQuantity }, - }); + return req.user.addToCart(product); }) - .then(() => { - res.redirect("/cart"); - }) - .catch((err) => console.log(err)); + .then((result) => { + console.log(result); + }); }; exports.postCartDeleteProduct = (req, res, next) => { diff --git a/data/cart.json b/src/data/cart.json similarity index 100% rename from data/cart.json rename to src/data/cart.json diff --git a/data/products.json b/src/data/products.json similarity index 100% rename from data/products.json rename to src/data/products.json diff --git a/data/uploads/Capture.PNG b/src/data/uploads/Capture.PNG similarity index 100% rename from data/uploads/Capture.PNG rename to src/data/uploads/Capture.PNG diff --git a/data/uploads/photo-1583912372139-6a46eb6eb119.jfif b/src/data/uploads/photo-1583912372139-6a46eb6eb119.jfif similarity index 100% rename from data/uploads/photo-1583912372139-6a46eb6eb119.jfif rename to src/data/uploads/photo-1583912372139-6a46eb6eb119.jfif diff --git a/src/language.js b/src/language.js new file mode 100644 index 0000000..90a4d33 --- /dev/null +++ b/src/language.js @@ -0,0 +1,18 @@ +const i18next = require("i18next"); +const middleware = require("i18next-express-middleware"); + +i18next.use(middleware.LanguageDetector).init({ + backend: { + loadPath: __dirname + "/locales/{{lng}}/{{ns}}.json", + }, + debug: false, + detection: { + order: ["querystring", "cookie"], + caches: ["cookie"], + }, + preload: ["en", "fr"], + saveMissing: true, + fallBackLng: ["en"], +}); + +module.exports = middleware.handle(i18next); diff --git a/src/app/locales/en/translation.json b/src/locales/en/translation.json similarity index 100% rename from src/app/locales/en/translation.json rename to src/locales/en/translation.json diff --git a/src/app/locales/fr/translation.json b/src/locales/fr/translation.json similarity index 100% rename from src/app/locales/fr/translation.json rename to src/locales/fr/translation.json diff --git a/models/order.js b/src/models/order.js similarity index 100% rename from models/order.js rename to src/models/order.js diff --git a/models/orderItems.js b/src/models/orderItems.js similarity index 100% rename from models/orderItems.js rename to src/models/orderItems.js diff --git a/models/product.js b/src/models/product.js similarity index 100% rename from models/product.js rename to src/models/product.js diff --git a/src/models/user.js b/src/models/user.js new file mode 100644 index 0000000..544c23a --- /dev/null +++ b/src/models/user.js @@ -0,0 +1,78 @@ +const mongodb = require("mongodb"); +const getDb = require("../utils/database").getDb; + +const ObjectId = mongodb.ObjectId; + +class User { + constructor(username, email, cart, id) { + this.name = username; + this.email = email; + this.cart = cart; + this._id = id; + } + + save() { + const db = getDb(); + return db.collection("users").insertOne(this); + } + + addToCart(product) { + const cartProductIndex = this.cart.items.findIndex((cp) => { + return cp.productId.toString() === product._id.toString(); + }); + + let newQuantity = 1; + const updatedCartItems = [...this.cart.items]; + + if (cartProductIndex >= 0) { + newQuantity = this.cart.items[cartProductIndex].quantity + 1; + updatedCartItems[cartProductIndex].quantity = newQuantity; + } else { + updatedCartItems.push({ + productId: new ObjectId(product._id), + quantity: newQuantity, + }); + } + const updatedCart = { + items: updatedCartItems, + }; + const db = getDb(); + return db.collection("users").updateOne({ _id: new ObjectId(this._id) }, { $set: { cart: updatedCart } }); + } + + getCart() { + const db = getDb(); + const productIds = this.cart.items.map((el) => { + return el.productId; + }); + return db + .collection("products") + .find({ _id: { $in: productIds } }) + .toArray() + .then((products) => { + return products.map((product) => { + return { + ...product, + quantity: this.cart.items.find((i) => { + return i.productId.toString() === product._id.toString(); + }).quantity, + }; + }); + }); + } + static findById(userId) { + const db = getDb(); + return db + .collection("users") + .find({ _id: new ObjectId(userId) }) + .next() + .then((user) => { + return user; + }) + .catch((err) => { + console.log(err); + }); + } +} + +module.exports = User; diff --git a/public/css/cart.css b/src/public/css/cart.css similarity index 100% rename from public/css/cart.css rename to src/public/css/cart.css diff --git a/public/css/forms.css b/src/public/css/forms.css similarity index 100% rename from public/css/forms.css rename to src/public/css/forms.css diff --git a/public/css/main.css b/src/public/css/main.css similarity index 100% rename from public/css/main.css rename to src/public/css/main.css diff --git a/public/css/product.css b/src/public/css/product.css similarity index 100% rename from public/css/product.css rename to src/public/css/product.css diff --git a/public/js/main.js b/src/public/js/main.js similarity index 100% rename from public/js/main.js rename to src/public/js/main.js diff --git a/routes/admin.js b/src/routes/admin.js similarity index 95% rename from routes/admin.js rename to src/routes/admin.js index bab323f..f4a7803 100644 --- a/routes/admin.js +++ b/src/routes/admin.js @@ -1,5 +1,3 @@ -const path = require("path"); - const express = require("express"); const adminController = require("../controllers/admin"); diff --git a/routes/shop.js b/src/routes/shop.js similarity index 83% rename from routes/shop.js rename to src/routes/shop.js index f1dfe66..459a03f 100644 --- a/routes/shop.js +++ b/src/routes/shop.js @@ -9,9 +9,9 @@ router.get("/products", shopController.getProducts); router.get("/products/:productId", shopController.getProduct); -// router.get("/cart", shopController.getCart); +router.get("/cart", shopController.getCart); -// router.post("/cart", shopController.postCart); +router.post("/cart", shopController.postCart); // router.post("/cart-delete-item", shopController.postCartDeleteProduct); diff --git a/translations.md b/src/translations.md similarity index 100% rename from translations.md rename to src/translations.md diff --git a/utils/database.js b/src/utils/database.js similarity index 100% rename from utils/database.js rename to src/utils/database.js diff --git a/utils/db.config.js b/src/utils/db.config.js similarity index 100% rename from utils/db.config.js rename to src/utils/db.config.js diff --git a/utils/path.js b/src/utils/path.js similarity index 100% rename from utils/path.js rename to src/utils/path.js diff --git a/views/404.ejs b/src/views/404.ejs similarity index 100% rename from views/404.ejs rename to src/views/404.ejs diff --git a/views/admin/edit-product.ejs b/src/views/admin/edit-product.ejs similarity index 100% rename from views/admin/edit-product.ejs rename to src/views/admin/edit-product.ejs diff --git a/views/admin/products.ejs b/src/views/admin/products.ejs similarity index 100% rename from views/admin/products.ejs rename to src/views/admin/products.ejs diff --git a/src/views/includes/add-to-cart.ejs b/src/views/includes/add-to-cart.ejs new file mode 100644 index 0000000..d302563 --- /dev/null +++ b/src/views/includes/add-to-cart.ejs @@ -0,0 +1,4 @@ +
+ + +
diff --git a/views/includes/end.ejs b/src/views/includes/end.ejs similarity index 100% rename from views/includes/end.ejs rename to src/views/includes/end.ejs diff --git a/views/includes/head.ejs b/src/views/includes/head.ejs similarity index 100% rename from views/includes/head.ejs rename to src/views/includes/head.ejs diff --git a/views/includes/navigation.ejs b/src/views/includes/navigation.ejs similarity index 100% rename from views/includes/navigation.ejs rename to src/views/includes/navigation.ejs diff --git a/views/shop/cart.ejs b/src/views/shop/cart.ejs similarity index 92% rename from views/shop/cart.ejs rename to src/views/shop/cart.ejs index b1facad..728a03b 100644 --- a/views/shop/cart.ejs +++ b/src/views/shop/cart.ejs @@ -10,9 +10,9 @@ <% products.forEach(p => { %>
  • <%= p.title %>

    -

    Quantity: <%= p.cartItem.quantity %>

    +

    Quantity: <%= p.quantity %>

    - +
  • diff --git a/views/shop/checkout.ejs b/src/views/shop/checkout.ejs similarity index 100% rename from views/shop/checkout.ejs rename to src/views/shop/checkout.ejs diff --git a/views/shop/index.ejs b/src/views/shop/index.ejs similarity index 100% rename from views/shop/index.ejs rename to src/views/shop/index.ejs diff --git a/views/shop/orders.ejs b/src/views/shop/orders.ejs similarity index 100% rename from views/shop/orders.ejs rename to src/views/shop/orders.ejs diff --git a/views/shop/product-detail.ejs b/src/views/shop/product-detail.ejs similarity index 100% rename from views/shop/product-detail.ejs rename to src/views/shop/product-detail.ejs diff --git a/views/shop/product-list.ejs b/src/views/shop/product-list.ejs similarity index 100% rename from views/shop/product-list.ejs rename to src/views/shop/product-list.ejs diff --git a/views/includes/add-to-cart.ejs b/views/includes/add-to-cart.ejs deleted file mode 100644 index 164a2d4..0000000 --- a/views/includes/add-to-cart.ejs +++ /dev/null @@ -1,4 +0,0 @@ -
    - - -
    \ No newline at end of file From b0c3858ecf26a896d23a4c9243eb7d6f54e05760 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Sun, 10 Oct 2021 14:00:12 +0530 Subject: [PATCH 10/20] #7 Converted Project in ES6 Converted the entire project to ES6 from ES5, and started working on the build scripts --- .babelrc | 2 +- package-lock.json | 2694 +++++++++++++++++- package.json | 16 +- server.js | 27 +- src/controllers/admin.js | 14 +- src/controllers/error.js | 6 +- src/controllers/shop.js | 18 +- src/locales/en/{translation.json => en.json} | 0 src/locales/fr/{translation.json => fr.json} | 0 src/routes/admin.js | 26 +- src/routes/shop.js | 30 +- webpack.config.js | 9 + 12 files changed, 2734 insertions(+), 108 deletions(-) rename src/locales/en/{translation.json => en.json} (100%) rename src/locales/fr/{translation.json => fr.json} (100%) create mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc index 53d1283..526ddfd 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["env", "stage-0"] + "presets": ["@babel/preset-env"] } diff --git a/package-lock.json b/package-lock.json index e4d0177..3ecb50d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,15 +24,1701 @@ "zen-observable-ts": "^1.1.0" } }, + "@babel/cli": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.15.7.tgz", + "integrity": "sha512-YW5wOprO2LzMjoWZ5ZG6jfbY9JnkDxuHDwvnrThnuYtByorova/I0HNXJedrUfwuXFQfYOjcqDA4PU3qlZGZjg==", + "dev": true, + "requires": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true + }, + "@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "dev": true + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "dev": true, + "requires": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", + "escalade": "^3.1.1", + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.864", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", + "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, "@babel/helper-validator-identifier": { "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dev": true, + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "@babel/node": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.15.8.tgz", + "integrity": "sha512-JbgTCrnx6IUECznEbQ7e2rbVYtrXKixSbEG2bxxbMkV648WdUf3tdc+ZUW2++dvnnAswcpwc76cRwf0xEQqsrw==", + "dev": true, + "requires": { + "@babel/register": "^7.15.3", + "commander": "^4.0.1", + "core-js": "^3.16.0", + "node-environment-flags": "^1.0.5", + "regenerator-runtime": "^0.13.4", + "v8flags": "^3.1.1" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "core-js": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.2.tgz", + "integrity": "sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + } + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", + "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } }, - "@babel/parser": { + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + } + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/register": { "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", - "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.15.3.tgz", + "integrity": "sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } }, "@babel/runtime": { "version": "7.15.4", @@ -49,6 +1735,103 @@ } } }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "dev": true + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "dev": true + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, "@babel/types": { "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", @@ -99,6 +1882,39 @@ "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==", "optional": true }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -114,6 +1930,12 @@ "defer-to-connect": "^1.0.1" } }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "@types/node": { "version": "16.7.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.3.tgz", @@ -186,32 +2008,37 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -301,6 +2128,12 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -1064,6 +2897,53 @@ "babel-runtime": "^6.22.0" } }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", @@ -2045,6 +3925,25 @@ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -2107,6 +4006,12 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -2206,12 +4111,99 @@ "dev": true, "optional": true }, + "copy-webpack-plugin": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", + "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", + "dev": true, + "requires": { + "fast-glob": "^3.2.5", + "glob-parent": "^6.0.0", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, "core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "dev": true }, + "core-js-compat": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.2.tgz", + "integrity": "sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ==", + "dev": true, + "requires": { + "browserslist": "^4.17.3", + "semver": "7.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", + "escalade": "^3.1.1", + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.864", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", + "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", + "dev": true + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2277,6 +4269,15 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -2402,6 +4403,15 @@ } } }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -2451,12 +4461,6 @@ "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -2486,6 +4490,51 @@ } } }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -2723,6 +4772,52 @@ } } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "filelist": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", @@ -2761,6 +4856,38 @@ "unpipe": "~1.0.0" } }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2887,6 +5014,12 @@ "is-property": "^1.0.2" } }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -2903,7 +5036,17 @@ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "pump": "^3.0.0" + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, "get-value": { @@ -2995,6 +5138,28 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -3087,6 +5252,12 @@ } } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -3201,6 +5372,15 @@ "os-tmpdir": "^1.0.1" } }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "http": { "version": "0.0.1-security", "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz", @@ -3305,6 +5485,12 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -3347,6 +5533,17 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -3376,6 +5573,15 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3385,6 +5591,16 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -3392,6 +5608,12 @@ "dev": true, "optional": true }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -3419,6 +5641,15 @@ "kind-of": "^3.0.2" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -3509,6 +5740,12 @@ "is-path-inside": "^3.0.1" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -3521,6 +5758,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -3538,7 +5784,6 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "optional": true, "requires": { "isobject": "^3.0.1" }, @@ -3547,8 +5792,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true + "dev": true } } }, @@ -3585,12 +5829,45 @@ "has-tostringtag": "^1.0.0" } }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -3699,6 +5976,12 @@ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -3752,11 +6035,27 @@ "package-json": "^6.3.0" } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -3851,6 +6150,12 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "messageformat": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", @@ -4279,6 +6584,28 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.2.0.tgz", "integrity": "sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==" }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "dev": true + }, "nodemon": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", @@ -4380,6 +6707,18 @@ } } }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -4399,6 +6738,29 @@ } } }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -4489,6 +6851,30 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -4541,6 +6927,12 @@ } } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -4553,6 +6945,12 @@ "dev": true, "optional": true }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4573,12 +6971,48 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -4809,6 +7243,12 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -4837,6 +7277,15 @@ } } }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4899,6 +7348,15 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -5064,6 +7522,21 @@ "any-promise": "^1.3.0" } }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5093,6 +7566,17 @@ "sparse-bitfield": "^3.0.3" } }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -5195,6 +7679,15 @@ "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -5241,6 +7734,23 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, "sharp": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.29.1.tgz", @@ -5279,6 +7789,17 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "sift": { "version": "13.5.2", "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", @@ -5566,12 +8087,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5595,6 +8110,26 @@ } } }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -5603,15 +8138,6 @@ "safe-buffer": "~5.1.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -5811,6 +8337,18 @@ "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", "optional": true }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -5820,6 +8358,34 @@ "debug": "^2.2.0" } }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -5919,6 +8485,15 @@ "xdg-basedir": "^4.0.0" } }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -6014,6 +8589,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -6112,6 +8700,12 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zen-observable": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", diff --git a/package.json b/package.json index 64bca92..326b4a2 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,12 @@ "version": "1.0.0", "description": "", "main": "server.js", + "type": "module", "scripts": { "start": "node server.js", - "dev": "nodemon server.js -e js,ejs,mjs,json" + "dev": "nodemon --exec babel-node server.js -e js,ejs,mjs,json", + "copy": "cp package.json dist/ && cp README.md dist/ && cp .npmrc dist/ && cp .env.prod dist/ && cp server.js dist/ && cp .babelrc dist/", + "build": "cp -r ./src/. ./dist && npm run copy" }, "keywords": [], "author": "Yash Karanke", @@ -38,19 +41,24 @@ "sharp": "^0.29.1" }, "devDependencies": { + "@babel/cli": "^7.15.7", + "@babel/core": "^7.15.8", + "@babel/node": "^7.15.8", + "@babel/preset-env": "^7.15.8", "babel-cli": "^6.26.0", "babel-preset-env": "^1.7.0", "babel-preset-es2015": "^6.24.1", "babel-preset-stage-2": "^6.24.1", "babel-register": "^6.26.0", + "copy-webpack-plugin": "^9.0.1", "nodemon": "^2.0.12" }, "prettier": { - "trailingComma": "es5", + "trailingComma": "all", "tabWidth": 4, "semi": true, "singleQuote": false, "useTabs": true, - "printWidth": 120 + "printWidth": 130 } -} +} \ No newline at end of file diff --git a/server.js b/server.js index d76cdcb..c234681 100644 --- a/server.js +++ b/server.js @@ -1,23 +1,22 @@ -const path = require("path"); -const mongoConnect = require("./src/utils/database").mongoConnect; -const port = process.env.PORT || 5000; -const express = require("express"); -const bodyParser = require("body-parser"); -const User = require("./src/models/user"); -const errorController = require("./src/controllers/error"); -const multer = require("multer"); +import bodyParser from "body-parser"; +import express from "express"; +import fs from "fs"; +import multer from "multer"; +import path from "path"; +import sharp from "sharp"; +import { get404 } from "./src/controllers/error"; +import User from "./src/models/user"; +import adminRoutes from "./src/routes/admin"; +import shopRoutes from "./src/routes/shop"; +import { mongoConnect } from "./src/utils/database"; const storage = multer.memoryStorage(); const uploads = multer({ storage }); -const sharp = require("sharp"); -const fs = require("fs"); +const port = process.env.PORT || 5000; const app = express(); app.set("view engine", "ejs"); app.set("views", path.join(__dirname, "/src/views")); -const adminRoutes = require("./src/routes/admin"); -const shopRoutes = require("./src/routes/shop"); - app.use(bodyParser.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, "/src/public"))); @@ -46,7 +45,7 @@ app.post("/api/v1/images", uploads.single("thumbnail"), async (req, res) => { res.send("success"); }); -app.use(errorController.get404); +app.use(get404); mongoConnect(() => { app.listen(port, () => { diff --git a/src/controllers/admin.js b/src/controllers/admin.js index c4f3881..00ea53f 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -1,6 +1,6 @@ -const Product = require("../models/product"); +import Product from "../models/product"; -exports.getAddProduct = (req, res, next) => { +export const getAddProduct = (req, res, next) => { res.render("admin/edit-product", { pageTitle: "Add Product", path: "/admin/add-product", @@ -8,7 +8,7 @@ exports.getAddProduct = (req, res, next) => { }); }; -exports.postAddProduct = (req, res, next) => { +export const postAddProduct = (req, res, next) => { const title = req.body.title; const imageUrl = req.body.imageUrl; const price = req.body.price; @@ -27,7 +27,7 @@ exports.postAddProduct = (req, res, next) => { }); }; -exports.getEditProduct = (req, res, next) => { +export const getEditProduct = (req, res, next) => { const editMode = req.query.edit; if (!editMode) { return res.redirect("/"); @@ -49,7 +49,7 @@ exports.getEditProduct = (req, res, next) => { .catch((err) => console.log(err)); }; -exports.postEditProduct = (req, res, next) => { +export const postEditProduct = (req, res, next) => { const prodId = req.body.productId; const updatedTitle = req.body.title; const updatedPrice = req.body.price; @@ -66,7 +66,7 @@ exports.postEditProduct = (req, res, next) => { .catch((err) => console.log(err)); }; -exports.getProducts = (req, res, next) => { +export const getProducts = (req, res, next) => { Product.fetchAll() .then((products) => { res.render("admin/products", { @@ -78,7 +78,7 @@ exports.getProducts = (req, res, next) => { .catch((err) => console.log(err)); }; -exports.postDeleteProduct = (req, res, next) => { +export const postDeleteProduct = (req, res, next) => { const prodId = req.body.productId; Product.deleteById(prodId) .then(() => { diff --git a/src/controllers/error.js b/src/controllers/error.js index f18dd81..b949f6d 100644 --- a/src/controllers/error.js +++ b/src/controllers/error.js @@ -1,3 +1,5 @@ -exports.get404 = (req, res, next) => { - res.status(404).render("404", { pageTitle: "Page Not Found", path: "/404" }); +const get404 = (req, res, next) => { + res.status(404).render("404", { pageTitle: "Page Not Found", path: "/404" }); }; + +export { get404 }; diff --git a/src/controllers/shop.js b/src/controllers/shop.js index adc560e..8ea1e4b 100644 --- a/src/controllers/shop.js +++ b/src/controllers/shop.js @@ -1,6 +1,6 @@ -const Product = require("../models/product"); +import Product from "../models/product"; -exports.getProducts = (req, res, next) => { +export const getProducts = (req, res, next) => { Product.fetchAll() .then((products) => { res.render("shop/product-list", { @@ -14,7 +14,7 @@ exports.getProducts = (req, res, next) => { }); }; -exports.getProduct = (req, res, next) => { +export const getProduct = (req, res, next) => { const prodId = req.params.productId; Product.findById(prodId) .then((product) => { @@ -27,7 +27,7 @@ exports.getProduct = (req, res, next) => { .catch((err) => console.log(err)); }; -exports.getIndex = (req, res, next) => { +export const getIndex = (req, res, next) => { Product.fetchAll() .then((products) => { res.render("shop/index", { @@ -41,7 +41,7 @@ exports.getIndex = (req, res, next) => { }); }; -exports.getCart = (req, res, next) => { +export const getCart = (req, res, next) => { req.user .getCart() .then((products) => { @@ -54,7 +54,7 @@ exports.getCart = (req, res, next) => { .catch((err) => console.log(err)); }; -exports.postCart = (req, res, next) => { +export const postCart = (req, res, next) => { const prodId = req.body.productId; console.log(req.user); Product.findById(prodId) @@ -66,7 +66,7 @@ exports.postCart = (req, res, next) => { }); }; -exports.postCartDeleteProduct = (req, res, next) => { +export const postCartDeleteProduct = (req, res, next) => { const prodId = req.body.productId; req.user .getCart() @@ -83,7 +83,7 @@ exports.postCartDeleteProduct = (req, res, next) => { .catch((err) => console.log(err)); }; -exports.postOrder = (req, res, next) => { +export const postOrder = (req, res, next) => { let fetchedCart; req.user .getCart() @@ -113,7 +113,7 @@ exports.postOrder = (req, res, next) => { .catch((err) => console.log(err)); }; -exports.getOrders = (req, res, next) => { +export const getOrders = (req, res, next) => { req.user .getOrders({ include: ["products"] }) .then((orders) => { diff --git a/src/locales/en/translation.json b/src/locales/en/en.json similarity index 100% rename from src/locales/en/translation.json rename to src/locales/en/en.json diff --git a/src/locales/fr/translation.json b/src/locales/fr/fr.json similarity index 100% rename from src/locales/fr/translation.json rename to src/locales/fr/fr.json diff --git a/src/routes/admin.js b/src/routes/admin.js index f4a7803..cdbb4f9 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -1,22 +1,28 @@ -const express = require("express"); - -const adminController = require("../controllers/admin"); +import express from "express"; +import { + getAddProduct, + getEditProduct, + getProducts, + postAddProduct, + postDeleteProduct, + postEditProduct, +} from "../controllers/admin"; const router = express.Router(); // /admin/add-product => GET -router.get("/add-product", adminController.getAddProduct); +router.get("/add-product", getAddProduct); // /admin/products => GET -router.get("/products", adminController.getProducts); +router.get("/products", getProducts); // /admin/add-product => POST -router.post("/add-product", adminController.postAddProduct); +router.post("/add-product", postAddProduct); -router.get("/edit-product/:productId", adminController.getEditProduct); +router.get("/edit-product/:productId", getEditProduct); -router.post("/edit-product", adminController.postEditProduct); +router.post("/edit-product", postEditProduct); -router.post("/delete-product", adminController.postDeleteProduct); +router.post("/delete-product", postDeleteProduct); -module.exports = router; +export default router; diff --git a/src/routes/shop.js b/src/routes/shop.js index 459a03f..fd4a6ad 100644 --- a/src/routes/shop.js +++ b/src/routes/shop.js @@ -1,22 +1,30 @@ const express = require("express"); - -const shopController = require("../controllers/shop"); +import { + getCart, + getIndex, + getProducts, + getProduct, + getOrders, + postCart, + postCartDeleteProduct, + postOrder, +} from "../controllers/shop"; const router = express.Router(); -router.get("/", shopController.getIndex); +router.get("/", getIndex); -router.get("/products", shopController.getProducts); +router.get("/products", getProducts); -router.get("/products/:productId", shopController.getProduct); +router.get("/products/:productId", getProduct); -router.get("/cart", shopController.getCart); +router.get("/cart", getCart); -router.post("/cart", shopController.postCart); +router.post("/cart", postCart); -// router.post("/cart-delete-item", shopController.postCartDeleteProduct); +// router.post("/cart-delete-item", postCartDeleteProduct); -// router.post("/create-order", shopController.postOrder); +// router.post("/create-order", postOrder); -// router.get("/orders", shopController.getOrders); +// router.get("/orders", getOrders); -module.exports = router; +export default router; diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..ded1617 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,9 @@ +const CopyPlugin = require("copy-webpack-plugin"); + +module.exports = { + plugins: [ + new CopyPlugin({ + patterns: [{ from: "src", to: "dist" }], + }), + ], +}; From 7447c8d5c0673103ffc25cd6a7d2b6048da85422 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Tue, 12 Oct 2021 09:28:52 +0530 Subject: [PATCH 11/20] Updated build command for AWS --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 326b4a2..23de4ea 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "start": "node server.js", "dev": "nodemon --exec babel-node server.js -e js,ejs,mjs,json", "copy": "cp package.json dist/ && cp README.md dist/ && cp .npmrc dist/ && cp .env.prod dist/ && cp server.js dist/ && cp .babelrc dist/", - "build": "cp -r ./src/. ./dist && npm run copy" + "build:dev": "cp -r ./src/. ./dist && npm run copy", + "build":"echo \"Unix timestamp: `date +%s`\"" }, "keywords": [], "author": "Yash Karanke", From a1c5aa3dce4b1534a0afcda4309de69c225c358d Mon Sep 17 00:00:00 2001 From: Smollet777 Date: Tue, 19 Oct 2021 08:18:26 +0300 Subject: [PATCH 12/20] Update cart.css --- src/public/css/cart.css | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/public/css/cart.css b/src/public/css/cart.css index 73f4755..ce6a81c 100644 --- a/src/public/css/cart.css +++ b/src/public/css/cart.css @@ -1,8 +1,7 @@ .cart__item-list { list-style: none; - margin: 0; + margin: 0 auto; padding: 0; - margin: auto; width: 40rem; max-width: 90%; } @@ -17,8 +16,7 @@ .cart__item h1, .cart__item h2 { - margin-right: 1rem; + margin: 0 1rem 0 0; font-size: 1.2rem; - margin: 0; } From 9c78fab35ed81b8942f0a8f01c7ebcb6ff6b6780 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Wed, 20 Oct 2021 09:37:35 +0530 Subject: [PATCH 13/20] fixed filepath --- server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index c234681..0940cf8 100644 --- a/server.js +++ b/server.js @@ -34,14 +34,14 @@ app.use(shopRoutes); app.post("/api/v1/images", uploads.single("thumbnail"), async (req, res) => { console.log("file", req.file); console.log("body", req.body); - fs.access("./data/uploads/", (err) => { + fs.access("./src/data/uploads/", (err) => { if (err) { fs.mkdirSync("./data/uploads"); } }); await sharp(req.file.buffer) .resize({ width: 650, height: 350 }) - .toFile("./data/uploads/" + req.file.originalname); + .toFile("./src/data/uploads/" + req.file.originalname); res.send("success"); }); From a66bcb9e969c9cbc6e72dd4d919bb09e0c45b1b8 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Sun, 7 Aug 2022 13:09:38 +0530 Subject: [PATCH 14/20] Copilot Added code regards to co-point, needs review --- src/models/user.js | 142 +++++++++++++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 50 deletions(-) diff --git a/src/models/user.js b/src/models/user.js index 544c23a..f5d936d 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -11,68 +11,110 @@ class User { this._id = id; } - save() { + login(email, password) { const db = getDb(); - return db.collection("users").insertOne(this); - } - - addToCart(product) { - const cartProductIndex = this.cart.items.findIndex((cp) => { - return cp.productId.toString() === product._id.toString(); - }); - - let newQuantity = 1; - const updatedCartItems = [...this.cart.items]; - - if (cartProductIndex >= 0) { - newQuantity = this.cart.items[cartProductIndex].quantity + 1; - updatedCartItems[cartProductIndex].quantity = newQuantity; - } else { - updatedCartItems.push({ - productId: new ObjectId(product._id), - quantity: newQuantity, + return db + .collection("users") + .findOne({ email: email }) + .then((user) => { + if (!user) { + return Promise.reject("User not found"); + } + return bcrypt.compare(password, user.password).then((res) => { + if (res) { + return Promise.resolve(user); + } + return Promise.reject("Wrong password"); + }); }); - } - const updatedCart = { - items: updatedCartItems, - }; - const db = getDb(); - return db.collection("users").updateOne({ _id: new ObjectId(this._id) }, { $set: { cart: updatedCart } }); } - getCart() { + save() { const db = getDb(); - const productIds = this.cart.items.map((el) => { - return el.productId; - }); - return db - .collection("products") - .find({ _id: { $in: productIds } }) - .toArray() - .then((products) => { - return products.map((product) => { - return { - ...product, - quantity: this.cart.items.find((i) => { - return i.productId.toString() === product._id.toString(); - }).quantity, - }; - }); - }); + return db.collection("users").insertOne(this); } - static findById(userId) { + + /** + * Create register api + */ + static register(username, email, password) { const db = getDb(); + const user = new User(username, email, [], new ObjectId()); return db .collection("users") - .find({ _id: new ObjectId(userId) }) - .next() + .findOne({ email: email }) .then((user) => { - return user; - }) - .catch((err) => { - console.log(err); + if (user) { + return Promise.reject("Email already exists"); + } + return bcrypt.hash(password, 12).then((hash) => { + user.password = hash; + return db.collection("users").insertOne(user); + }).then(() => { + return user; + }); }); } } + +addToCart(product) { + const cartProductIndex = this.cart.items.findIndex((cp) => { + return cp.productId.toString() === product._id.toString(); + }); + + let newQuantity = 1; + const updatedCartItems = [...this.cart.items]; + + if (cartProductIndex >= 0) { + newQuantity = this.cart.items[cartProductIndex].quantity + 1; + updatedCartItems[cartProductIndex].quantity = newQuantity; + } else { + updatedCartItems.push({ + productId: new ObjectId(product._id), + quantity: newQuantity, + }); + } + const updatedCart = { + items: updatedCartItems, + }; + const db = getDb(); + return db.collection("users").updateOne({ _id: new ObjectId(this._id) }, { $set: { cart: updatedCart } }); +} + +getCart() { + const db = getDb(); + const productIds = this.cart.items.map((el) => { + return el.productId; + }); + return db + .collection("products") + .find({ _id: { $in: productIds } }) + .toArray() + .then((products) => { + return products.map((product) => { + return { + ...product, + quantity: this.cart.items.find((i) => { + return i.productId.toString() === product._id.toString(); + }).quantity, + }; + }); + }); +} + static findById(userId) { + const db = getDb(); + return db + .collection("users") + .find({ _id: new ObjectId(userId) }) + .next() + .then((user) => { + return user; + }) + .catch((err) => { + console.log(err); + }); +} +} + module.exports = User; From b49c14dd20f79c275e32c3e5d378d9ea5d703135 Mon Sep 17 00:00:00 2001 From: Jaideep Vidwani Date: Fri, 30 Sep 2022 20:32:22 +0530 Subject: [PATCH 15/20] #13 code review added null or undefined check to avoid code break --- src/controllers/shop.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/controllers/shop.js b/src/controllers/shop.js index 8ea1e4b..43bed50 100644 --- a/src/controllers/shop.js +++ b/src/controllers/shop.js @@ -74,8 +74,11 @@ export const postCartDeleteProduct = (req, res, next) => { return cart.getProducts({ where: { id: prodId } }); }) .then((products) => { - const product = products[0]; - return product.cartItem.destroy(); + if (products && products.length > 0) { + const product = products[0]; + return product.cartItem.destroy(); + } + return; }) .then((result) => { res.redirect("/cart"); From 6b02161c0755f027170d9b924b3d376f53adbf34 Mon Sep 17 00:00:00 2001 From: Yash Karanke Date: Sun, 2 Oct 2022 18:16:36 +0530 Subject: [PATCH 16/20] #13 Code review Code review, removed unnecessary console logs --- src/controllers/admin.js | 8 ++++---- src/utils/database.js | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 00ea53f..12c5fb9 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -23,7 +23,7 @@ export const postAddProduct = (req, res, next) => { res.redirect("/admin/products"); }) .catch((err) => { - console.log(err); + throw Error(err); }); }; @@ -46,7 +46,7 @@ export const getEditProduct = (req, res, next) => { product: product, }); }) - .catch((err) => console.log(err)); + .catch((err) => {throw Error(err)}); }; export const postEditProduct = (req, res, next) => { @@ -63,7 +63,7 @@ export const postEditProduct = (req, res, next) => { console.log("UPDATED PRODUCT!"); res.redirect("/admin/products"); }) - .catch((err) => console.log(err)); + .catch((err) => {throw Error(err)}); }; export const getProducts = (req, res, next) => { @@ -75,7 +75,7 @@ export const getProducts = (req, res, next) => { path: "/admin/products", }); }) - .catch((err) => console.log(err)); + .catch((err) => {throw Error(err)}); }; export const postDeleteProduct = (req, res, next) => { diff --git a/src/utils/database.js b/src/utils/database.js index 7aa43cd..6bd978e 100644 --- a/src/utils/database.js +++ b/src/utils/database.js @@ -9,11 +9,9 @@ const mongoConnect = (callback) => { ) .then((client) => { _db = client.db(""); - console.log("Connected"); callback(); }) .catch((err) => { - console.error(err); throw new Error("An Error Occured"); }); }; From bd31f0322a70151899577f3dae9a7b1285a0c5d0 Mon Sep 17 00:00:00 2001 From: Yash Karanke Date: Sun, 2 Oct 2022 19:50:48 +0530 Subject: [PATCH 17/20] Formatted document --- src/controllers/error.js | 2 +- src/views/admin/edit-product.ejs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/controllers/error.js b/src/controllers/error.js index b949f6d..a940ec2 100644 --- a/src/controllers/error.js +++ b/src/controllers/error.js @@ -1,5 +1,5 @@ const get404 = (req, res, next) => { - res.status(404).render("404", { pageTitle: "Page Not Found", path: "/404" }); + res.status(404).render("404", { pageTitle: "Page Not Found", path: "/404" }); }; export { get404 }; diff --git a/src/views/admin/edit-product.ejs b/src/views/admin/edit-product.ejs index 87098b8..ffffe6d 100644 --- a/src/views/admin/edit-product.ejs +++ b/src/views/admin/edit-product.ejs @@ -5,7 +5,6 @@ <%- include('../includes/navigation.ejs') %> -
    From 64614a424d5ab66434f6706cf736717e283f9883 Mon Sep 17 00:00:00 2001 From: Yash Karanke Date: Mon, 3 Oct 2022 13:00:26 +0530 Subject: [PATCH 18/20] #13 code review + Changed normal function to named function, It's ideal to use arrow function instead of conventional function if we are not returning anything --- src/public/js/main.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/public/js/main.js b/src/public/js/main.js index 26e2f12..3cdaaaf 100644 --- a/src/public/js/main.js +++ b/src/public/js/main.js @@ -2,15 +2,15 @@ const backdrop = document.querySelector(".backdrop"); const sideDrawer = document.querySelector(".mobile-nav"); const menuToggle = document.querySelector("#side-menu-toggle"); -function backdropClickHandler() { - backdrop.style.display = "none"; - sideDrawer.classList.remove("open"); -} +const backdropClickHandler = () => { + backdrop.style.display = "none"; + sideDrawer.classList.remove("open"); +}; -function menuToggleClickHandler() { - backdrop.style.display = "block"; - sideDrawer.classList.add("open"); -} +const menuToggleClickHandler = () => { + backdrop.style.display = "block"; + sideDrawer.classList.add("open"); +}; backdrop.addEventListener("click", backdropClickHandler); menuToggle.addEventListener("click", menuToggleClickHandler); From b26d588c2cd3383ed67146ff905b2a2a2aa5ae85 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Mon, 2 Oct 2023 16:15:15 +0530 Subject: [PATCH 19/20] add get404 controller --- server.js | 45 ++++++++++++++++++++-------------------- src/controllers/error.js | 3 +-- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/server.js b/server.js index 79e8f9e..200383b 100644 --- a/server.js +++ b/server.js @@ -4,15 +4,14 @@ import fs from "fs"; import multer from "multer"; import path from "path"; import sharp from "sharp"; -import { -} from "./src/controllers/error"; +import { get404 } from "./src/controllers/error"; import User from "./src/models/user"; import adminRoutes from "./src/routes/admin"; import shopRoutes from "./src/routes/shop"; import { mongoConnect } from "./src/utils/database"; const storage = multer.memoryStorage(); const uploads = multer({ storage }); -const port = process.env.PORT || 5000; +const port = process.env.PORT || 1337; const app = express(); app.set("view engine", "ejs"); @@ -22,34 +21,34 @@ app.use(bodyParser.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, "/src/public"))); app.use((req, res, next) => { - User.findById("615490961edaa81fdda5f2c7") - .then((user) => { - req.user = new User(user.name, user.email, user.cart, user._id); - next(); - }) - .catch((err) => console.log(err)); + User.findById("615490961edaa81fdda5f2c7") + .then((user) => { + req.user = new User(user.name, user.email, user.cart, user._id); + next(); + }) + .catch((err) => console.log(err)); }); app.use("/admin", adminRoutes); app.use(shopRoutes); app.post("/api/v1/images", uploads.single("thumbnail"), async (req, res) => { - console.log("file", req.file); - console.log("body", req.body); - fs.access("./src/data/uploads/", (err) => { - if (err) { - fs.mkdirSync("./data/uploads"); - } - }); - await sharp(req.file.buffer) - .resize({ width: 650, height: 350 }) - .toFile("./src/data/uploads/" + req.file.originalname); - res.send("success"); + console.log("file", req.file); + console.log("body", req.body); + fs.access("./src/data/uploads/", (err) => { + if (err) { + fs.mkdirSync("./data/uploads"); + } + }); + await sharp(req.file.buffer) + .resize({ width: 650, height: 350 }) + .toFile("./src/data/uploads/" + req.file.originalname); + res.send("success"); }); app.use(get404); mongoConnect(() => { - app.listen(port, () => { - console.log(`server is running on ${port}`); - }); + app.listen(port, () => { + console.log(`server is running on ${port}`); + }); }); diff --git a/src/controllers/error.js b/src/controllers/error.js index a940ec2..3c17d58 100644 --- a/src/controllers/error.js +++ b/src/controllers/error.js @@ -1,5 +1,4 @@ -const get404 = (req, res, next) => { +export const get404 = (req, res, next) => { res.status(404).render("404", { pageTitle: "Page Not Found", path: "/404" }); }; -export { get404 }; From 475490b08babaa1e2794f3fcbbf840a6acff7f59 Mon Sep 17 00:00:00 2001 From: Yash Karanke <16697307+dextel2@users.noreply.github.com> Date: Mon, 2 Oct 2023 16:17:31 +0530 Subject: [PATCH 20/20] add new book --- src/data/products.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/data/products.json b/src/data/products.json index a141085..8d9cab5 100644 --- a/src/data/products.json +++ b/src/data/products.json @@ -5,5 +5,12 @@ "imageUrl": "https://www.publicdomainpictures.net/pictures/10000/velka/1-1210009435EGmE.jpg", "description": "This is an awesome book!", "price": "19" + }, + { + "id": "1337", + "title": "An Awesome Book", + "imageUrl": "https://www.publicdomainpictures.net/pictures/10000/velka/1-1210009435EGmE.jpg", + "description": "This is an awesome book!", + "price": "20" } ] \ No newline at end of file