diff --git a/.gitignore b/.gitignore
index 40b878db..650e52f0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-node_modules/
\ No newline at end of file
+node_modules/
+
+.env
\ No newline at end of file
diff --git a/.sequelizerc b/.sequelizerc
new file mode 100644
index 00000000..ea338e42
--- /dev/null
+++ b/.sequelizerc
@@ -0,0 +1,8 @@
+const path = require('path');
+
+module.exports = {
+ config: path.resolve('config', 'database.js'),
+ 'models-path': path.resolve('db', 'models'),
+ 'seeders-path': path.resolve('db', 'seeders'),
+ 'migrations-path': path.resolve('db', 'migrations'),
+};
diff --git a/config/database.js b/config/database.js
new file mode 100644
index 00000000..697f4666
--- /dev/null
+++ b/config/database.js
@@ -0,0 +1,11 @@
+require('dotenv').config();
+
+module.exports = {
+ development: {
+ username: process.env.DB_USERNAME,
+ password: process.env.DB_PASSWORD,
+ database: process.env.DB_NAME,
+ host: process.env.DB_HOST,
+ dialect: process.env.DB_DIALECT,
+ },
+};
diff --git a/controllers/addressesController.js b/controllers/addressesController.js
new file mode 100644
index 00000000..7ba63e54
--- /dev/null
+++ b/controllers/addressesController.js
@@ -0,0 +1,119 @@
+const BaseController = require('./baseController');
+const { QueryTypes } = require('sequelize'); // Import DataTypes and QueryTypes
+
+class AddressesController extends BaseController {
+ constructor(model, userModel) {
+ super(model);
+ this.userModel = userModel;
+ }
+
+ async getAllAddresses(req, res) {
+ try {
+ const address = await this.model.sequelize.query(
+ `SELECT "id", "buyer_id", "address", "created_at" AS "createdAt", "updated_at" AS "updatedAt", "buyer_id" AS "user_id" FROM "addresses"`,
+ {
+ type: this.model.sequelize.QueryTypes.SELECT,
+ },
+ );
+
+ return res.json(address); // Assuming you expect only one address
+ } catch (err) {
+ console.error(err);
+ return res.status(400).send(err);
+ }
+ }
+
+ // Get a single address
+ async getAddress(req, res) {
+ const { addressId } = req.params;
+ try {
+ const address = await this.model.sequelize.query(
+ `SELECT "id", "buyer_id", "address", "created_at" AS "createdAt", "updated_at" AS "updatedAt", "buyer_id" AS "user_id" FROM "addresses" WHERE "id" = :addressId`,
+ {
+ replacements: { addressId },
+ type: this.model.sequelize.QueryTypes.SELECT,
+ },
+ );
+ return res.json(address[0]); // Assuming you expect only one address
+ } catch (err) {
+ console.error(err);
+ return res.status(400).send(err);
+ }
+ }
+
+ async getAddressIdBasedOnActualAddress(req, res) {
+ const { delivery_address } = req.query;
+
+ try {
+ const address = await this.model.findOne({
+ where: {
+ address: delivery_address,
+ },
+ });
+
+ return res.status(200).json(address.id);
+ } catch (err) {
+ console.error(err);
+ return res.status(400).json({ error: true, msg: err });
+ }
+ }
+
+ async postNewAddress(req, res) {
+ const { email, address } = req.body;
+
+ const allAddresses = await this.model.sequelize.query(
+ `SELECT "id", "buyer_id", "address", "created_at" AS "createdAt", "updated_at" AS "updatedAt", "buyer_id" AS "user_id" FROM "addresses"`,
+ {
+ type: this.model.sequelize.QueryTypes.SELECT,
+ },
+ );
+
+ const arrayOfAddresses = allAddresses.map(
+ (singleAddress) => singleAddress.address,
+ );
+
+ if (!arrayOfAddresses.includes(address)) {
+ try {
+ const [buyer] = await this.userModel.findOrCreate({
+ where: { email: email },
+ });
+
+ const queryResult = await this.model.sequelize.query(
+ 'INSERT INTO "addresses" ("buyer_id", "address", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id", "buyer_id", "address", "created_at", "updated_at"',
+ {
+ bind: [buyer.id, address, new Date(), new Date()],
+ type: QueryTypes.INSERT,
+ },
+ );
+
+ const newAddress = queryResult[0];
+
+ return res.json(newAddress);
+ } catch (err) {
+ console.error(err);
+ return res.status(400).json({ error: true, msg: err.message });
+ }
+ } else {
+ return res.send('Address already exists!');
+ }
+ }
+
+ async deleteOne(req, res) {
+ const { addressId } = req.params;
+
+ try {
+ await this.model.destroy({
+ where: {
+ id: addressId,
+ },
+ });
+
+ res.status(200).send(`Successfully deleted address at id ${addressId}`);
+ } catch (error) {
+ console.error(error);
+ res.status(400).send({ error: true, msg: error });
+ }
+ }
+}
+
+module.exports = AddressesController;
diff --git a/controllers/baseController.js b/controllers/baseController.js
new file mode 100644
index 00000000..80960e10
--- /dev/null
+++ b/controllers/baseController.js
@@ -0,0 +1,16 @@
+class BaseController {
+ constructor(model) {
+ this.model = model;
+ }
+
+ async getAll(req, res) {
+ try {
+ const output = await this.model.findAll();
+ return res.json(output);
+ } catch (err) {
+ return res.status(400).json({ error: true, msg: err });
+ }
+ }
+}
+
+module.exports = BaseController;
diff --git a/controllers/categoriesController.js b/controllers/categoriesController.js
new file mode 100644
index 00000000..7df0c323
--- /dev/null
+++ b/controllers/categoriesController.js
@@ -0,0 +1,70 @@
+const BaseController = require('./baseController');
+
+class CategoriesController extends BaseController {
+ constructor(model, productModel) {
+ super(model);
+ this.productModel = productModel;
+ }
+
+ async getOne(req, res) {
+ const { categoryId } = req.params;
+
+ try {
+ const category = await this.model.findByPk(categoryId);
+
+ res.send(category);
+ } catch (err) {
+ res.status(400).json({ error: true, msg: err });
+ }
+ }
+
+ async postOne(req, res) {
+ const { name } = req.body;
+
+ try {
+ const newCategory = await this.model.create({
+ name: name,
+ });
+
+ res.send(newCategory);
+ } catch (err) {
+ res.status(400).json({ error: true, msg: err });
+ }
+ }
+
+ async updateOne(req, res) {
+ const { categoryId } = req.params;
+
+ const { name } = req.body;
+
+ try {
+ const categoryToBeUpdated = await this.model.findByPk(categoryId);
+
+ const updatedCategory = await categoryToBeUpdated.update({
+ name: name,
+ });
+
+ res.send(updatedCategory);
+ } catch (err) {
+ return res.status(400).json({ error: true, msg: err });
+ }
+ }
+
+ async deleteOne(req, res) {
+ const { categoryId } = req.params;
+
+ try {
+ await this.model.destroy({
+ where: {
+ id: categoryId,
+ },
+ });
+
+ res.send('Category has been deleted!');
+ } catch (err) {
+ res.status(400).json({ error: true, msg: err });
+ }
+ }
+}
+
+module.exports = CategoriesController;
diff --git a/controllers/ordersController.js b/controllers/ordersController.js
new file mode 100644
index 00000000..52f0fa35
--- /dev/null
+++ b/controllers/ordersController.js
@@ -0,0 +1,143 @@
+const BaseController = require('./baseController');
+const Sequelize = require('sequelize');
+const sequelize = new Sequelize(
+ `postgres://${process.env.DB_USERNAME}:@${process.env.DB_HOST}:5432/${process.env.DB_NAME}`,
+);
+
+class OrdersController extends BaseController {
+ constructor(model, userModel, productModel, orderProductModel, addressModel) {
+ super(model);
+ this.userModel = userModel;
+ this.productModel = productModel;
+ this.orderProductModel = orderProductModel;
+ this.addressModel = addressModel;
+ }
+
+ async getAllOrdersOfCurrUser(req, res) {
+ const { email } = req.query;
+ try {
+ const user = await this.userModel.findOrCreate({
+ where: { email: email },
+ });
+ const user_id = user[0].dataValues.id;
+ const orders = await this.model.findAll({
+ where: { user_id: user_id },
+ include: [
+ {
+ model: this.productModel,
+ attributes: ['id', 'title', 'price', 'img'],
+ through: {
+ model: this.orderProductModel,
+ attributes: ['quantity'],
+ },
+ },
+ { model: this.addressModel, attributes: ['address'] },
+ ],
+ });
+ return res.json(orders);
+ } catch (err) {
+ return res.status(400).json({ error: true, msg: err.message });
+ }
+ }
+
+ async postOne(req, res) {
+ const { address_id, user_id, total_price, products } = req.body;
+
+ if (!products || products.length === 0) {
+ return res
+ .status(400)
+ .json({ error: true, msg: 'No products in the order' });
+ }
+
+ try {
+ await sequelize.transaction(async (t) => {
+ const newOrder = await this.model.create(
+ {
+ address_id: address_id,
+ user_id: user_id,
+ total_price: total_price,
+ },
+ { transaction: t },
+ );
+
+ const arrayOfJunctionTableEntries = [];
+ for (let i = 0; i < products.length; i++) {
+ const productObj = products[i];
+ const [id, quantity] = Object.entries(productObj)[0];
+ const newEntryInOrderProducts = await this.orderProductModel.create(
+ {
+ order_id: newOrder.dataValues.id,
+ product_id: id,
+ quantity: quantity,
+ },
+ { transaction: t },
+ );
+ arrayOfJunctionTableEntries.push(newEntryInOrderProducts);
+ }
+
+ const purchasedProducts = [];
+
+ for (let i = 0; i < products.length; i++) {
+ const productObj = products[i];
+ const [id, quantity] = Object.entries(productObj)[0];
+
+ const product = await this.productModel.findByPk(id);
+
+ const stock = product.dataValues.stock_left;
+
+ const stock_left = stock - quantity;
+
+ const updatedProduct = await product.update(
+ { stock_left: stock_left },
+ { transaction: t },
+ );
+
+ purchasedProducts.push(updatedProduct);
+ }
+
+ return res.send([
+ newOrder,
+ arrayOfJunctionTableEntries,
+ purchasedProducts,
+ ]);
+ });
+ } catch (err) {
+ console.error(err.message);
+ return res.status(400).json({ error: true, msg: err });
+ }
+ }
+
+ async getOne(req, res) {
+ const { orderId } = req.params;
+
+ const order = await this.model.findByPk(orderId, {
+ include: [
+ {
+ association: 'products',
+ },
+ { model: this.addressModel, attributes: ['address'] },
+ ],
+ });
+
+ return res.send(order);
+ }
+
+ async deleteOne(req, res) {
+ const { orderId } = req.params;
+
+ try {
+ await this.model.destroy({
+ where: {
+ id: orderId,
+ },
+ });
+
+ res.status(200).send('Success:');
+ } catch (error) {
+ console.error(error);
+ res.status(400).send({ error: true, msg: error });
+ }
+ }
+}
+
+module.exports = OrdersController;
diff --git a/controllers/productsController.js b/controllers/productsController.js
new file mode 100644
index 00000000..ba826797
--- /dev/null
+++ b/controllers/productsController.js
@@ -0,0 +1,336 @@
+const BaseController = require('./baseController');
+const Mailjet = require('node-mailjet');
+require('dotenv').config();
+
+const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
+
+// Mailjet Configuration
+const mailjet = Mailjet.apiConnect(
+ process.env.MJ_APIKEY_PUBLIC,
+ process.env.MJ_APIKEY_PRIVATE,
+ {
+ config: {},
+ options: {},
+ },
+);
+
+class ProductsController extends BaseController {
+ constructor(model, ordersModel, categoryModel) {
+ super(model);
+ this.ordersModel = ordersModel;
+ this.categoryModel = categoryModel;
+ }
+ async getAll(req, res) {
+ const { categoryName } = req.query;
+
+ try {
+ let products;
+ if (categoryName) {
+ const category = await this.categoryModel.findAll({
+ where: { name: categoryName },
+ });
+ const categoryId = category[0].dataValues.id;
+ products = await this.model.findAll({
+ where: { category_id: categoryId },
+ });
+ } else {
+ products = await this.model.findAll();
+ }
+
+ return res.json(products);
+ } catch (err) {
+ console.log(err);
+ return res.status(400).json({ error: true, msg: err });
+ }
+ }
+
+ async getOne(req, res) {
+ const { productId } = req.params;
+
+ try {
+ const product = await this.model.findByPk(productId, {
+ include: {
+ association: 'orders',
+ },
+ });
+
+ return res.json(product);
+ } catch (err) {
+ return res.status(400).json({ error: true, msg: err.message });
+ }
+ }
+
+ async updateOne(req, res) {
+ const { productId } = req.params;
+
+ const { stock_purchased } = req.body;
+
+ const productToBeBought = await this.model.findByPk(productId);
+
+ const { title, price, description } = productToBeBought.dataValues;
+
+ const purchasedProduct = {
+ title: title,
+ price: price,
+ description: description,
+ stock_purchased: stock_purchased,
+ };
+
+ const stock_left = productToBeBought.dataValues.stock_left;
+
+ await productToBeBought.update({
+ stock_left: stock_left - stock_purchased,
+ });
+
+ res.send(purchasedProduct);
+ }
+
+ async postOne(req, res) {
+ const { title, price, description, stock_left, img, categoryId } = req.body;
+
+ try {
+ const newProduct = await this.model.create({
+ title: title,
+ price: price,
+ description: description,
+ stock_left: stock_left,
+ img: img,
+ categoryId: categoryId,
+ });
+
+ res.send(newProduct);
+ } catch (err) {
+ return res.status(400).send(err);
+ }
+ }
+
+ async createStripeProduct(req, res) {
+ try {
+ const product = stripe.products
+ .create({
+ name: 'Starter Subscription',
+ description: '$12/Month subscription',
+ })
+ .then((product) => {
+ stripe.prices
+ .create({
+ unit_amount: 1200,
+ currency: 'usd',
+ recurring: {
+ interval: 'month',
+ },
+ product: product.id,
+ })
+ .then((price) => {
+ console.log(
+ 'Success! Here is your starter subscription product id: ' +
+ product.id,
+ );
+ console.log(
+ 'Success! Here is your starter subscription price id: ' +
+ price.id,
+ );
+ });
+ });
+
+ return res.send(product);
+ } catch (err) {
+ return res.status(400).send(err);
+ }
+ }
+
+ async seedRemainingStripeProducts(req, res) {
+ try {
+ const productIds = [15, 26, 30, 32];
+ const products = await this.model.findAll({
+ where: {
+ id: productIds,
+ },
+ });
+
+ const formattedOutput = products.map((product) => product.dataValues);
+
+ await Promise.all(
+ formattedOutput.map(async (product) => {
+ const productPrice = product.price;
+ try {
+ await stripe.products
+ .create({
+ name: product.title,
+ description: product.description,
+ })
+ .then((product) => {
+ stripe.prices.create({
+ unit_amount: productPrice,
+ currency: 'sgd',
+ product: product.id,
+ });
+ })
+ .then((response) => {
+ console.log('Success! Here are the product details:', response);
+ });
+ } catch (err) {
+ console.error(`Error creating product in Stripe`, err);
+ }
+ }),
+ );
+
+ return res.json(products);
+ } catch (err) {
+ return res.status(400).send(err);
+ }
+ }
+
+ async seedStripeProducts(req, res) {
+ try {
+ const output = await this.model.findAll();
+ const formattedOutput = output.map((product) => product.dataValues);
+
+ // Promise.all method for creating all the stripe products
+ await Promise.all(
+ formattedOutput.map(async (product) => {
+ const productPrice = product.price;
+ try {
+ await stripe.products
+ .create({
+ name: product.title,
+ description: product.description,
+ })
+ .then((product) => {
+ stripe.prices.create({
+ unit_amount: productPrice,
+ currency: 'sgd',
+ product: product.id,
+ });
+ })
+ .then((response) => {
+ console.log('Success! Here are the product details:', response);
+ });
+ } catch (err) {
+ console.error(`Error creating product in Stripe`, err);
+ }
+ }),
+ );
+
+ return res.json(output);
+ } catch (err) {
+ return res.status(400).send(err);
+ }
+ }
+
+ async makePaymentMultiple(req, res) {
+ const { priceIds, userFirstName, userLastName, userEmail, itemNames } =
+ req.body;
+
+ if (itemNames) {
+ var itemList = itemNames.map((item) => `
${item}`).join('');
+ }
+
+ try {
+ const session = await stripe.checkout.sessions.create({
+ line_items: priceIds.map((priceId) => ({
+ price: `${priceId.priceId}`,
+ quantity: priceId.quantity,
+ })),
+ mode: 'payment',
+ success_url: `http://localhost:5173/order/success`,
+ cancel_url: `http://localhost:5173/checkout`,
+ });
+
+ res.json({ url: session.url });
+ } catch (err) {
+ res.status(500).json({ error: 'Error creaing checkout session' });
+ }
+
+ // Sending email to customer
+ try {
+ const request = mailjet.post('send', { version: 'v3.1' }).request({
+ Messages: [
+ {
+ From: {
+ Email: 'ianchow9898@gmail.com',
+ Name: 'Techie E-Store',
+ },
+ To: [
+ {
+ Email: userEmail,
+ Name: userFirstName,
+ },
+ ],
+ Subject: 'Thank you for purchasing from Techie E-Store',
+ TextPart:
+ 'Dear Ian, welcome to Techie E-store! May the technological force be with you!',
+ HTMLPart: `Dear ${userFirstName} ${userLastName}, Thank you for purchasing from Techie E-store!
Here are the items you purchased:
+
+ If you have any questions, concerns, or want to share your thoughts, email support at ianchow9898@gmail.com.
+ May the technological force be with you!
`,
+ },
+ ],
+ });
+
+ request
+ .then((response) => {
+ console.log('Success in sending email: ', response);
+ })
+ .catch((err) => {
+ console.log(err);
+ });
+ } catch (err) {
+ return res.status(400).json({ error: true, msg: err });
+ }
+ }
+
+ async getAllPricesFromStripe(req, res) {
+ try {
+ const prices = await stripe.prices.list();
+ const pricesData = prices.data;
+
+ return res.send(pricesData);
+ } catch (err) {
+ console.error(`Error fetching prices: ${err}`);
+ throw err;
+ }
+ }
+
+ async sendMailToCustomer(req, res) {
+ try {
+ const request = mailjet.post('send', { version: 'v3.1' }).request({
+ Messages: [
+ {
+ From: {
+ Email: 'ianchow9898@gmail.com',
+ Name: 'Mailjet Pilot',
+ },
+ To: [
+ {
+ Email: 'ianchow989898@gmail.com',
+ Name: 'passenger 1',
+ },
+ ],
+ Subject: 'Your email flight plan!',
+ TextPart:
+ 'Dear Ian, welcome to Mailjet! May the delivery force be with you!',
+ HTMLPart:
+ 'Dear Ian, welcome to Mailjet!
May the delivery force be with you!',
+ },
+ ],
+ });
+
+ request
+ .then((result) => {
+ console.log(result);
+ })
+ .catch((err) => {
+ console.log(err.statusCode);
+ });
+
+ return res.json(request);
+ } catch (err) {
+ return res.status(400).json({ error: true, msg: err });
+ }
+ }
+}
+
+module.exports = ProductsController;
diff --git a/controllers/usersController.js b/controllers/usersController.js
new file mode 100644
index 00000000..368bfa3c
--- /dev/null
+++ b/controllers/usersController.js
@@ -0,0 +1,92 @@
+const BaseController = require('./baseController');
+require('dotenv').config();
+
+const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
+
+class UsersController extends BaseController {
+ constructor(model) {
+ super(model);
+ }
+
+ async getUserBasedOnEmail(req, res) {
+ const { email } = req.body;
+
+ try {
+ const targetUser = await this.model.findOne({
+ where: { email: email },
+ });
+
+ return res.json(targetUser);
+ } catch (err) {
+ console.log(err.message);
+ return res.status(400).json({ error: true, msg: err.message });
+ }
+ }
+
+ async postNewUser(req, res) {
+ const { first_name, last_name, email } = req.body;
+ try {
+ const newUser = await this.model.create({
+ first_name,
+ last_name,
+ email,
+ });
+ return res.json(newUser);
+ } catch (err) {
+ console.log(err.message);
+ return res.status(400).json({ error: true, msg: err.message });
+ }
+ }
+
+ async updateUser(req, res) {
+ const { userId } = req.params;
+ const { first_name, last_name, phone_number, email } = req.body;
+ try {
+ const userToBeUpdated = await this.model.findByPk(userId);
+
+ const updatedUser = await userToBeUpdated.update({
+ first_name,
+ last_name,
+ phone_number,
+ email,
+ });
+
+ res.send(updatedUser);
+ } catch (err) {
+ return res.status(400).json({ error: true, msg: err.message });
+ }
+ }
+
+ // Not working
+ async getStripeCustomerDetails(req, res) {
+ try {
+ const session = await stripe.checkout.sessions.retrieve(
+ req.query.session_id,
+ );
+
+ const customer = await stripe.customers.retrieve(session.customer);
+
+ res.send(customer);
+ } catch (err) {
+ return res.status(400).json({ error: true, msg: err.message });
+ }
+ }
+
+ async deleteOne(req, res) {
+ const { userId } = req.params;
+
+ try {
+ await this.model.destroy({
+ where: {
+ id: userId,
+ },
+ });
+
+ res.status(200).send(`Successfully deleted user at user id: ${userId}`);
+ } catch (error) {
+ console.error(error);
+ res.status(400).send({ error: true, msg: error });
+ }
+ }
+}
+module.exports = UsersController;
diff --git a/db/migrations/20240316122103-create-order.js b/db/migrations/20240316122103-create-order.js
new file mode 100644
index 00000000..6762a381
--- /dev/null
+++ b/db/migrations/20240316122103-create-order.js
@@ -0,0 +1,31 @@
+'use strict';
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ await queryInterface.createTable('orders', {
+ id: {
+ allowNull: false,
+ autoIncrement: true,
+ primaryKey: true,
+ type: Sequelize.INTEGER,
+ },
+ quantity: {
+ type: Sequelize.BIGINT,
+ },
+ delivery_address: {
+ type: Sequelize.STRING,
+ },
+ created_at: {
+ allowNull: false,
+ type: Sequelize.DATE,
+ },
+ updated_at: {
+ allowNull: false,
+ type: Sequelize.DATE,
+ },
+ });
+ },
+ async down(queryInterface) {
+ await queryInterface.dropTable('orders');
+ },
+};
diff --git a/db/migrations/20240316122617-create-product.js b/db/migrations/20240316122617-create-product.js
new file mode 100644
index 00000000..d13d865b
--- /dev/null
+++ b/db/migrations/20240316122617-create-product.js
@@ -0,0 +1,43 @@
+'use strict';
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ await queryInterface.createTable('products', {
+ id: {
+ allowNull: false,
+ autoIncrement: true,
+ primaryKey: true,
+ type: Sequelize.INTEGER,
+ },
+ title: {
+ type: Sequelize.STRING,
+ },
+ price: {
+ type: Sequelize.BIGINT,
+ },
+ description: {
+ type: Sequelize.TEXT,
+ },
+ shipping_details: {
+ type: Sequelize.TEXT,
+ },
+ stock_left: {
+ type: Sequelize.BIGINT,
+ },
+ model_url: {
+ type: Sequelize.STRING,
+ },
+ created_at: {
+ allowNull: false,
+ type: Sequelize.DATE,
+ },
+ updated_at: {
+ allowNull: false,
+ type: Sequelize.DATE,
+ },
+ });
+ },
+ async down(queryInterface) {
+ await queryInterface.dropTable('products');
+ },
+};
diff --git a/db/migrations/20240316123402-order_products.js b/db/migrations/20240316123402-order_products.js
new file mode 100644
index 00000000..a8c4a784
--- /dev/null
+++ b/db/migrations/20240316123402-order_products.js
@@ -0,0 +1,47 @@
+'use strict';
+
+// const { query } = require('express');
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.createTable('order_products', {
+ id: {
+ allowNull: false,
+ autoIncrement: true,
+ primaryKey: true,
+ type: Sequelize.INTEGER,
+ },
+ order_id: {
+ type: Sequelize.INTEGER,
+ references: {
+ model: 'orders',
+ key: 'id',
+ },
+ },
+ product_id: {
+ type: Sequelize.INTEGER,
+ references: {
+ model: 'products',
+ key: 'id',
+ },
+ },
+ });
+ },
+
+ async down(queryInterface) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.dropTable('order_products');
+ },
+};
diff --git a/db/migrations/20240317072217-create-user.js b/db/migrations/20240317072217-create-user.js
new file mode 100644
index 00000000..b0a301ed
--- /dev/null
+++ b/db/migrations/20240317072217-create-user.js
@@ -0,0 +1,37 @@
+'use strict';
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ await queryInterface.createTable('users', {
+ id: {
+ allowNull: false,
+ autoIncrement: true,
+ primaryKey: true,
+ type: Sequelize.INTEGER
+ },
+ first_name: {
+ type: Sequelize.STRING
+ },
+ last_name: {
+ type: Sequelize.STRING
+ },
+ phone_number: {
+ type: Sequelize.STRING
+ },
+ email: {
+ type: Sequelize.STRING
+ },
+ created_at: {
+ allowNull: false,
+ type: Sequelize.DATE
+ },
+ updated_at: {
+ allowNull: false,
+ type: Sequelize.DATE
+ }
+ });
+ },
+ async down(queryInterface, Sequelize) {
+ await queryInterface.dropTable('users');
+ }
+};
\ No newline at end of file
diff --git a/db/migrations/20240317080602-create-address.js b/db/migrations/20240317080602-create-address.js
new file mode 100644
index 00000000..03852765
--- /dev/null
+++ b/db/migrations/20240317080602-create-address.js
@@ -0,0 +1,31 @@
+'use strict';
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ await queryInterface.createTable('addresses', {
+ id: {
+ allowNull: false,
+ autoIncrement: true,
+ primaryKey: true,
+ type: Sequelize.INTEGER
+ },
+ buyer_id: {
+ type: Sequelize.INTEGER
+ },
+ address: {
+ type: Sequelize.TEXT
+ },
+ created_at: {
+ allowNull: false,
+ type: Sequelize.DATE
+ },
+ updated_at: {
+ allowNull: false,
+ type: Sequelize.DATE
+ }
+ });
+ },
+ async down(queryInterface, Sequelize) {
+ await queryInterface.dropTable('addresses');
+ }
+};
\ No newline at end of file
diff --git a/db/migrations/20240319052653-addBuyerIdToOrders.js b/db/migrations/20240319052653-addBuyerIdToOrders.js
new file mode 100644
index 00000000..3f426232
--- /dev/null
+++ b/db/migrations/20240319052653-addBuyerIdToOrders.js
@@ -0,0 +1,34 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+
+ await queryInterface.addColumn('orders', 'user_id', {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'users',
+ key: 'id',
+ },
+ onUpdate: 'CASCADE',
+ onDelete: 'CASCADE',
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.removeColumn('orders', 'user_id');
+ },
+};
diff --git a/db/migrations/20240320173826-remove_orders_table_column.js b/db/migrations/20240320173826-remove_orders_table_column.js
new file mode 100644
index 00000000..871806d6
--- /dev/null
+++ b/db/migrations/20240320173826-remove_orders_table_column.js
@@ -0,0 +1,30 @@
+'use strict';
+
+const { query } = require('express');
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+
+ await queryInterface.removeColumn('orders', 'quantity');
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.addColumn('orders', 'quantity', {
+ type: Sequelize.INTEGER,
+ allowNull: true,
+ });
+ },
+};
diff --git a/db/migrations/20240321013233-alter_users_table.js b/db/migrations/20240321013233-alter_users_table.js
new file mode 100644
index 00000000..7f920dea
--- /dev/null
+++ b/db/migrations/20240321013233-alter_users_table.js
@@ -0,0 +1,31 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+
+ await queryInterface.changeColumn('users', 'email', {
+ type: Sequelize.STRING,
+ allowNull: false,
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.changeColumn('users', 'email', {
+ type: Sequelize.STRING,
+ allowNull: true,
+ });
+ },
+};
diff --git a/db/migrations/20240321120211-alter_products_table.js b/db/migrations/20240321120211-alter_products_table.js
new file mode 100644
index 00000000..2ebc042b
--- /dev/null
+++ b/db/migrations/20240321120211-alter_products_table.js
@@ -0,0 +1,27 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.addColumn('products', 'img', {
+ type: Sequelize.STRING,
+ allowNull: true,
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.removeColumn('products', 'img');
+ },
+};
diff --git a/db/migrations/20240321124122-create-category.js b/db/migrations/20240321124122-create-category.js
new file mode 100644
index 00000000..a6568498
--- /dev/null
+++ b/db/migrations/20240321124122-create-category.js
@@ -0,0 +1,28 @@
+'use strict';
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ await queryInterface.createTable('categories', {
+ id: {
+ allowNull: false,
+ autoIncrement: true,
+ primaryKey: true,
+ type: Sequelize.INTEGER
+ },
+ name: {
+ type: Sequelize.STRING
+ },
+ created_at: {
+ allowNull: false,
+ type: Sequelize.DATE
+ },
+ updated_at: {
+ allowNull: false,
+ type: Sequelize.DATE
+ }
+ });
+ },
+ async down(queryInterface, Sequelize) {
+ await queryInterface.dropTable('categories');
+ }
+};
\ No newline at end of file
diff --git a/db/migrations/20240321142247-altering_product_table_category_id.js b/db/migrations/20240321142247-altering_product_table_category_id.js
new file mode 100644
index 00000000..ef28dc05
--- /dev/null
+++ b/db/migrations/20240321142247-altering_product_table_category_id.js
@@ -0,0 +1,32 @@
+'use strict';
+
+const { query } = require('express');
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.addColumn('products', 'category_id', {
+ type: Sequelize.INTEGER,
+ references: {
+ model: 'categories',
+ key: 'id',
+ },
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.removeColumn('products', 'category_id');
+ },
+};
diff --git a/db/migrations/20240322164151-alternate-addresses-table.js b/db/migrations/20240322164151-alternate-addresses-table.js
new file mode 100644
index 00000000..29b807ff
--- /dev/null
+++ b/db/migrations/20240322164151-alternate-addresses-table.js
@@ -0,0 +1,25 @@
+"use strict";
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ await queryInterface.addConstraint("addresses", {
+ fields: ["buyer_id"],
+ type: "foreign key",
+ name: "fk_addresses_buyer_id_users",
+ references: {
+ table: "users",
+ field: "id",
+ },
+ onDelete: "CASCADE",
+ onUpdate: "CASCADE",
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ await queryInterface.removeConstraint(
+ "addresses",
+ "fk_addresses_buyer_id_users"
+ );
+ },
+};
diff --git a/db/migrations/20240324155800-delete_shipping_details.js b/db/migrations/20240324155800-delete_shipping_details.js
new file mode 100644
index 00000000..b6957218
--- /dev/null
+++ b/db/migrations/20240324155800-delete_shipping_details.js
@@ -0,0 +1,27 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.removeColumn('products', 'shipping_details');
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ *
+ */
+ await queryInterface.addColumn('products', 'shipping_details', {
+ type: Sequelize.STRING,
+ });
+ },
+};
diff --git a/db/migrations/20240324161443-delete_model_url.js b/db/migrations/20240324161443-delete_model_url.js
new file mode 100644
index 00000000..d4cac068
--- /dev/null
+++ b/db/migrations/20240324161443-delete_model_url.js
@@ -0,0 +1,26 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.removeColumn('products', 'model_url');
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.addColumn('products', 'model_url', {
+ type: Sequelize.STRING,
+ });
+ },
+};
diff --git a/db/migrations/20240325132810-modify-img-column.js b/db/migrations/20240325132810-modify-img-column.js
new file mode 100644
index 00000000..67534458
--- /dev/null
+++ b/db/migrations/20240325132810-modify-img-column.js
@@ -0,0 +1,28 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.changeColumn('products', 'img', {
+ type: Sequelize.STRING(500),
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.changeColumn('products', 'img', {
+ type: Sequelize.STRING,
+ });
+ },
+};
diff --git a/db/migrations/20240326031254-add-stripe-price-id.js b/db/migrations/20240326031254-add-stripe-price-id.js
new file mode 100644
index 00000000..56596823
--- /dev/null
+++ b/db/migrations/20240326031254-add-stripe-price-id.js
@@ -0,0 +1,28 @@
+'use strict';
+
+const { query } = require('express');
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.addColumn('products', 'stripe_id', {
+ type: Sequelize.STRING,
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.removeColumn('products', 'stripe_id');
+ },
+};
diff --git a/db/migrations/20240326130525-adding_total_price.js b/db/migrations/20240326130525-adding_total_price.js
new file mode 100644
index 00000000..f391b23e
--- /dev/null
+++ b/db/migrations/20240326130525-adding_total_price.js
@@ -0,0 +1,26 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.addColumn('orders', 'total_price', {
+ type: Sequelize.BIGINT,
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.removeColumn('orders', 'total_price');
+ },
+};
diff --git a/db/migrations/20240326131803-adding_quantity_products.js b/db/migrations/20240326131803-adding_quantity_products.js
new file mode 100644
index 00000000..112eec10
--- /dev/null
+++ b/db/migrations/20240326131803-adding_quantity_products.js
@@ -0,0 +1,26 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.addColumn('order_products', 'quantity_products', {
+ type: Sequelize.BIGINT,
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.removeColumn('order_products', 'quantity_products');
+ },
+};
diff --git a/db/migrations/20240405151346-remove_order_products_table.js b/db/migrations/20240405151346-remove_order_products_table.js
new file mode 100644
index 00000000..2301fd43
--- /dev/null
+++ b/db/migrations/20240405151346-remove_order_products_table.js
@@ -0,0 +1,49 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.dropTable('order_products');
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+
+ await queryInterface.createTable('order_products', {
+ id: {
+ allowNull: false,
+ autoIncrement: true,
+ primaryKey: true,
+ type: Sequelize.INTEGER,
+ },
+ order_id: {
+ type: Sequelize.INTEGER,
+ references: {
+ model: 'orders',
+ key: 'id',
+ },
+ },
+ product_id: {
+ type: Sequelize.INTEGER,
+ references: {
+ model: 'products',
+ key: 'id',
+ },
+ },
+ quantity_products: {
+ type: Sequelize.INTEGER,
+ },
+ });
+ },
+};
diff --git a/db/migrations/20240405153012-create-order-products.js b/db/migrations/20240405153012-create-order-products.js
new file mode 100644
index 00000000..1a14ecb5
--- /dev/null
+++ b/db/migrations/20240405153012-create-order-products.js
@@ -0,0 +1,48 @@
+'use strict';
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ await queryInterface.createTable('order_products', {
+ id: {
+ allowNull: false,
+ autoIncrement: true,
+ primaryKey: true,
+ type: Sequelize.INTEGER,
+ },
+ order_id: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'orders',
+ key: 'id',
+ },
+ onUpdate: 'CASCADE',
+ onDelete: 'CASCADE',
+ },
+ product_id: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'products',
+ key: 'id',
+ },
+ onUpdate: 'CASCADE',
+ onDelete: 'CASCADE',
+ },
+ quantity: {
+ type: Sequelize.INTEGER,
+ },
+ created_at: {
+ allowNull: false,
+ type: Sequelize.DATE,
+ },
+ updated_at: {
+ allowNull: false,
+ type: Sequelize.DATE,
+ },
+ });
+ },
+ async down(queryInterface, Sequelize) {
+ await queryInterface.dropTable('order_products');
+ },
+};
diff --git a/db/migrations/20240409022146-adding-foreign-constraints-to-orders-tale.js b/db/migrations/20240409022146-adding-foreign-constraints-to-orders-tale.js
new file mode 100644
index 00000000..b7ceda2f
--- /dev/null
+++ b/db/migrations/20240409022146-adding-foreign-constraints-to-orders-tale.js
@@ -0,0 +1,26 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.removeColumn('orders', 'delivery_address');
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.addColumn('orders', 'delivery_address', {
+ type: Sequelize.STRING,
+ });
+ },
+};
diff --git a/db/migrations/20240409022653-adding-address-column-to-orders-table.js b/db/migrations/20240409022653-adding-address-column-to-orders-table.js
new file mode 100644
index 00000000..4d133f21
--- /dev/null
+++ b/db/migrations/20240409022653-adding-address-column-to-orders-table.js
@@ -0,0 +1,39 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ await queryInterface.addColumn('orders', 'address_id', {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ });
+
+ await queryInterface.addConstraint('orders', {
+ fields: ['address_id'],
+ type: 'foreign key',
+ name: 'fk_orders_address_id_addresses',
+ references: {
+ table: 'addresses',
+ field: 'id',
+ },
+ onDelete: 'CASCADE',
+ onUpdate: 'CASCADE',
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ await queryInterface.removeColumn('orders', 'address_id');
+ },
+};
diff --git a/db/models/address.js b/db/models/address.js
new file mode 100644
index 00000000..2e30b877
--- /dev/null
+++ b/db/models/address.js
@@ -0,0 +1,36 @@
+'use strict';
+const { Model } = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+ class Address extends Model {
+ /**
+ * Helper method for defining associations.
+ * This method is not a part of Sequelize lifecycle.
+ * The `models/index` file will call this method automatically.
+ */
+ static associate(models) {
+ // define association here
+ // this.belongsTo(models.user);
+ // // 1 to Many with orders
+ // this.hasMany(models.address);
+ }
+ }
+ Address.init(
+ {
+ buyer_id: {
+ type: DataTypes.INTEGER,
+ field: 'buyer_id',
+ references: {
+ model: 'users',
+ key: 'id',
+ },
+ },
+ address: DataTypes.TEXT,
+ },
+ {
+ sequelize,
+ modelName: 'address',
+ underscored: true,
+ },
+ );
+ return Address;
+};
diff --git a/db/models/category.js b/db/models/category.js
new file mode 100644
index 00000000..ba29a381
--- /dev/null
+++ b/db/models/category.js
@@ -0,0 +1,27 @@
+'use strict';
+const { Model } = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+ class Category extends Model {
+ /**
+ * Helper method for defining associations.
+ * This method is not a part of Sequelize lifecycle.
+ * The `models/index` file will call this method automatically.
+ */
+ static associate(models) {
+ // define association here
+ this.hasMany(models.product); // Singular comment
+ }
+ }
+ Category.init(
+ {
+ name: DataTypes.STRING,
+ },
+ {
+ sequelize,
+ modelName: 'category',
+ timestamps: true,
+ underscored: true,
+ },
+ );
+ return Category;
+};
diff --git a/db/models/index.js b/db/models/index.js
new file mode 100644
index 00000000..3b4daa94
--- /dev/null
+++ b/db/models/index.js
@@ -0,0 +1,50 @@
+"use strict";
+
+const fs = require("fs");
+const path = require("path");
+const Sequelize = require("sequelize");
+const process = require("process");
+const basename = path.basename(__filename);
+const env = process.env.NODE_ENV || "development";
+const config = require(__dirname + "/../../config/database.js")[env];
+const db = {};
+
+let sequelize;
+if (config.use_env_variable) {
+ sequelize = new Sequelize(process.env[config.use_env_variable], config);
+} else {
+ sequelize = new Sequelize(
+ config.database,
+ config.username,
+ config.password,
+ config
+ );
+}
+
+fs.readdirSync(__dirname)
+ .filter((file) => {
+ return (
+ file.indexOf(".") !== 0 &&
+ file !== basename &&
+ file.slice(-3) === ".js" &&
+ file.indexOf(".test.js") === -1
+ );
+ })
+ .forEach((file) => {
+ const model = require(path.join(__dirname, file))(
+ sequelize,
+ Sequelize.DataTypes
+ );
+ db[model.name] = model;
+ });
+
+Object.keys(db).forEach((modelName) => {
+ if (db[modelName].associate) {
+ db[modelName].associate(db);
+ }
+});
+
+db.sequelize = sequelize;
+db.Sequelize = Sequelize;
+
+module.exports = db;
diff --git a/db/models/order.js b/db/models/order.js
new file mode 100644
index 00000000..3c6cd003
--- /dev/null
+++ b/db/models/order.js
@@ -0,0 +1,51 @@
+"use strict";
+const { Model } = require("sequelize");
+module.exports = (sequelize, DataTypes) => {
+ class Order extends Model {
+ static associate(models) {
+ // define association here
+
+ // Many-to-1 relationship with addresses table
+ this.belongsTo(models.address);
+
+ // Many-to-1 relationship with user
+ this.belongsTo(models.user);
+
+ // Many-to-Many relationship with products with junction table order_products
+ this.belongsToMany(models.product, {
+ through: "order_products",
+ foreignKey: "order_id",
+ });
+ }
+ }
+ Order.init(
+ {
+ // quantity: DataTypes.BIGINT,
+ // delivery_address: DataTypes.STRING,
+ address_id: {
+ type: DataTypes.INTEGER,
+ references: {
+ model: "addresses",
+ key: "id",
+ },
+ },
+ user_id: {
+ type: DataTypes.INTEGER,
+ references: {
+ // Sequelize docs suggest this should be plural table name and not singular model name
+ // https://sequelize.org/api/v6/class/src/model.js~model#static-method-init
+ model: "users",
+ key: "id",
+ },
+ },
+ total_price: DataTypes.INTEGER,
+ },
+ {
+ sequelize,
+ modelName: "order",
+ timestamps: true,
+ underscored: true,
+ }
+ );
+ return Order;
+};
diff --git a/db/models/order_products.js b/db/models/order_products.js
new file mode 100644
index 00000000..fbffbc4d
--- /dev/null
+++ b/db/models/order_products.js
@@ -0,0 +1,47 @@
+'use strict';
+const { Model } = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+ class order_products extends Model {
+ /**
+ * JUNCTION TABLE BETWEEN ORDERS AND PRODUCTS
+ * Helper method for defining associations.
+ * This method is not a part of Sequelize lifecycle.
+ * The `models/index` file will call this method automatically.
+ */
+ static associate(models) {
+ // Define association with orders
+ this.belongsTo(models.order, { foreignKey: 'order_id' });
+ // Define association with products
+ this.belongsTo(models.product, { foreignKey: 'product_id' });
+ }
+ }
+ order_products.init(
+ {
+ order_id: DataTypes.INTEGER,
+ // order_id: {
+ // type: DataTypes.INTEGER,
+
+ // references: {
+ // model: 'orders',
+ // key: 'id',
+ // },
+ // },
+ product_id: DataTypes.INTEGER,
+ // product_id: {
+ // type: DataTypes.INTEGER,
+
+ // references: {
+ // model: 'products',
+ // key: 'id',
+ // },
+ // },
+ quantity: DataTypes.INTEGER,
+ },
+ {
+ sequelize,
+ modelName: 'order_products',
+ underscored: true,
+ },
+ );
+ return order_products;
+};
diff --git a/db/models/product.js b/db/models/product.js
new file mode 100644
index 00000000..0854ef69
--- /dev/null
+++ b/db/models/product.js
@@ -0,0 +1,39 @@
+'use strict';
+const { Model } = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+ class Product extends Model {
+ /**
+ * Helper method for defining associations.
+ * This method is not a part of Sequelize lifecycle.
+ * The `models/index` file will call this method automatically.
+ */
+ static associate(models) {
+ // define association here
+ this.belongsToMany(models.order, {
+ through: 'order_products',
+ foreignKey: 'product_id',
+ });
+
+ // Define association with categories here
+ this.belongsTo(models.category);
+ }
+ }
+ Product.init(
+ {
+ title: DataTypes.STRING,
+ price: DataTypes.BIGINT,
+ description: DataTypes.TEXT,
+ // shipping_details: DataTypes.TEXT,
+ stock_left: DataTypes.BIGINT,
+ // model_url: DataTypes.STRING,
+ img: DataTypes.TEXT,
+ stripe_id: DataTypes.STRING,
+ },
+ {
+ sequelize,
+ modelName: 'product',
+ underscored: true,
+ },
+ );
+ return Product;
+};
diff --git a/db/models/user.js b/db/models/user.js
new file mode 100644
index 00000000..1aaab3d1
--- /dev/null
+++ b/db/models/user.js
@@ -0,0 +1,29 @@
+'use strict';
+const { Model } = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+ class User extends Model {
+ /**
+ * Helper method for defining associations.
+ * This method is not a part of Sequelize lifecycle.
+ * The `models/index` file will call this method automatically.
+ */
+ static associate(models) {
+ // define association here
+ // this.hasMany(models.address);
+ }
+ }
+ User.init(
+ {
+ first_name: DataTypes.STRING,
+ last_name: DataTypes.STRING,
+ phone_number: DataTypes.STRING,
+ email: DataTypes.STRING,
+ },
+ {
+ sequelize,
+ modelName: 'user',
+ underscored: true,
+ },
+ );
+ return User;
+};
diff --git a/db/seeders/20230317072356-seed-users.js b/db/seeders/20230317072356-seed-users.js
new file mode 100644
index 00000000..6067eff4
--- /dev/null
+++ b/db/seeders/20230317072356-seed-users.js
@@ -0,0 +1,50 @@
+"use strict";
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add seed commands here.
+ *
+ * Example:
+ * await queryInterface.bulkInsert('People', [{
+ * name: 'John Doe',
+ * isBetaMember: false
+ * }], {});
+ */
+
+ await queryInterface.bulkInsert(
+ "users",
+ [
+ {
+ first_name: "Peter",
+ last_name: "Pan",
+ phone_number: 33335555,
+ email: "peter@peter.com",
+ created_at: new Date(),
+ updated_at: new Date(),
+ },
+ {
+ first_name: "Harry",
+ last_name: "Potter",
+ phone_number: 44445555,
+ email: "harry@harry.com",
+ created_at: new Date(),
+ updated_at: new Date(),
+ },
+ ],
+ {}
+ );
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add commands to revert seed here.
+ *
+ * Example:
+ * await queryInterface.bulkDelete('People', null, {});
+ */
+
+ await queryInterface.bulkDelete("users", null, {});
+ },
+};
diff --git a/db/seeders/20240316125451-seed-products.js b/db/seeders/20240316125451-seed-products.js
new file mode 100644
index 00000000..9dfc938a
--- /dev/null
+++ b/db/seeders/20240316125451-seed-products.js
@@ -0,0 +1,352 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add seed commands here.
+ *
+ * Example:
+ * await queryInterface.bulkInsert('People', [{
+ * name: 'John Doe',
+ * isBetaMember: false
+ * }], {});
+ */
+ await queryInterface.bulkInsert(
+ 'products',
+ [
+ {
+ title: 'UltraBook Pro X1',
+ price: 1999,
+ description: `Experience unparalleled performance with the UltraBook Pro X1.`,
+ stock_left: 40,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/71sgAr9atBS._AC_UF894,1000_QL80_.jpg',
+ category_id: 2,
+ },
+ {
+ title: 'Gaming Beast X2000',
+ price: 2499,
+ description: `Unleash your gaming potential with the Gaming Beast X2000.`,
+ stock_left: 30,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/71s1LRpaprL._AC_UF894,1000_QL80_.jpg',
+ category_id: 2,
+ },
+ {
+ title: 'ZenBook Infinity Pro',
+ price: 1799,
+ description: `Unlock your creativity with the ZenBook Infinity Pro.`,
+ stock_left: 35,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/71qKfFqgEiL._AC_UF894,1000_QL80_.jpg',
+ category_id: 2,
+ },
+ {
+ title: 'EliteBook Fusion 500',
+ price: 1599,
+ description: `Stay ahead in business with the EliteBook Fusion 500.`,
+ stock_left: 25,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://static-ecpa.acer.com/media/catalog/product/n/i/nitro5_an515-57_bl_bk_modelmain_5.png?optimize=high&bg-color=255,255,255&fit=bounds&height=500&width=500&canvas=500:500&format=jpeg',
+ category_id: 2,
+ },
+ {
+ title: 'ThinkPad Flex 9X',
+ price: 1899,
+ description: `Adapt to any situation with the ThinkPad Flex 9X.`,
+ stock_left: 20,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://p4-ofp.static.pub/ShareResource/na/subseries/gallery/lenovo-ideapad-5i-gaming-chromebook-gen7-16inch-02.png',
+ category_id: 2,
+ },
+ {
+ title: 'Surface Pro X',
+ price: 2099,
+ description: `Experience versatility like never before with the Surface Pro X.`,
+ stock_left: 15,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://i.dell.com/is/image/DellContent/content/dam/ss2/product-images/dell-client-products/notebooks/g-series/g16-7630/media-gallery/black/notebook-g16-7630-nt-black-gallery-1.psd?fmt=pjpg&pscan=auto&scl=1&wid=3500&hei=2625&qlt=100,1&resMode=sharp2&size=3500,2625&chrss=full&imwidth=5000',
+ category_id: 2,
+ },
+ {
+ title: 'SwiftBook Pro 2025',
+ price: 1699,
+ description: `Speed up your productivity with the SwiftBook Pro 2025.`,
+ stock_left: 18,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://i.dell.com/is/image/DellContent/content/dam/ss2/product-images/dell-client-products/notebooks/latitude-notebooks/latitude-15-5540-laptop/media-gallery/notebook-latitude-15-5540-nt-rgb-silver-gallery-1.psd?fmt=pjpg&pscan=auto&scl=1&wid=4565&hei=2814&qlt=100,1&resMode=sharp2&size=4565,2814&chrss=full&imwidth=5000',
+ category_id: 2,
+ },
+ {
+ title: 'ChromeBook Plus X3',
+ price: 1199,
+ description: `Simplify your life with the ChromeBook Plus X3.`,
+ stock_left: 22,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://www.apple.com/newsroom/images/tile-images/Apple_16-inch-MacBook-Pro_111319.jpg.og.jpg?202402240715',
+ category_id: 2,
+ },
+ {
+ title: 'Galaxy S22 Ultra',
+ price: 1299,
+ description: `Experience the ultimate smartphone with the Galaxy S22 Ultra.`,
+ stock_left: 50,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://image-us.samsung.com/SamsungUS/home/mobile/phones/pdp/galazy-a/galaxy-a03s/gallery/blue/Galaxy-A03s-blue-1.jpg?$product-details-jpg$',
+ category_id: 3,
+ },
+ {
+ title: 'iPhone 14 Pro',
+ price: 1399,
+ description: `Discover the power of innovation with the iPhone 14 Pro.`,
+ stock_left: 45,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://cdn.alloallo.media/catalog/product/apple/iphone/iphone-13/iphone-13-pink.jpg',
+ category_id: 3,
+ },
+ {
+ title: 'Pixel 7',
+ price: 999,
+ description: `Get ready for the future with the Pixel 7.`,
+ stock_left: 60,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/713N4SwTtKL._AC_UF894,1000_QL80_.jpg',
+ category_id: 3,
+ },
+ {
+ title: 'OnePlus 10 Pro',
+ price: 1099,
+ description: `Experience speed and elegance with the OnePlus 10 Pro.`,
+ stock_left: 55,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/51qnMfIlsCL.jpg',
+ category_id: 3,
+ },
+ {
+ title: 'Xperia 1 IV',
+ price: 1199,
+ description: `Unleash your creativity with the Xperia 1 IV.`,
+ stock_left: 40,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://sony.scene7.com/is/image/sonyglobalsolutions/PDX-223_black_v01-1?$categorypdpnav$&fmt=png-alpha',
+ category_id: 3,
+ },
+ {
+ title: 'Redmi Note 11 Pro',
+ price: 799,
+ description: `Elevate your mobile experience with the Redmi Note 11 Pro.`,
+ stock_left: 65,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/61dcWgQnk3L.jpg',
+ category_id: 3,
+ },
+ {
+ title: 'Galaxy A53 5G',
+ price: 599,
+ description: `Enjoy fast connectivity and great features with the Galaxy A53 5G.`,
+ stock_left: 70,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://www.zdnet.com/a/img/resize/37520f97f54a8559c3ccb8616db7dae30ea3807f/2023/01/04/6b12b43b-3cb9-4579-840a-a68cc85c643b/samsung-galaxy-a15-ag.jpg?auto=webp&width=1280',
+ category_id: 3,
+ },
+ {
+ title: 'Mi 12',
+ price: 999,
+ description: `Discover the future of smartphones with the Mi 12.`,
+ stock_left: 50,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://i01.appmifile.com/v1/MI_18455B3E4DA706226CF7535A58E875F0267/pms_1598463305.19882560!400x400!85.png',
+ category_id: 3,
+ },
+ {
+ title: 'Wireless Earbuds Pro',
+ price: 199,
+ description: `Experience premium sound quality with the Wireless Earbuds Pro.`,
+ stock_left: 100,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://store.storeimages.cdn-apple.com/8756/as-images.apple.com/is/MQLH3?wid=1144&hei=1144&fmt=jpeg&qlt=90&.v=1682361480584',
+ category_id: 4,
+ },
+ {
+ title: 'Smartwatch X3',
+ price: 299,
+ description: `Stay connected and organized with the Smartwatch X3.`,
+ stock_left: 80,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/71VSFdowcuL.jpg',
+ category_id: 4,
+ },
+ {
+ title: 'Wireless Charging Pad',
+ price: 49,
+ description: `Simplify your charging experience with the Wireless Charging Pad.`,
+ stock_left: 120,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://store.storeimages.cdn-apple.com/8756/as-images.apple.com/is/HR302?wid=1144&hei=1144&fmt=jpeg&qlt=90&.v=1695069091086',
+ category_id: 4,
+ },
+ {
+ title: 'Laptop Stand',
+ price: 39,
+ description: `Improve your workspace ergonomics with the Laptop Stand.`,
+ stock_left: 150,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/51KPdFrp4WL.jpg',
+ category_id: 4,
+ },
+ {
+ title: 'Bluetooth Keyboard',
+ price: 79,
+ description: `Enhance your productivity with the Bluetooth Keyboard.`,
+ stock_left: 90,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://resource.logitech.com/w_692,c_lpad,ar_4:3,q_auto,f_auto,dpr_1.0/d_transparent.gif/content/dam/logitech/en/products/keyboards/multi-keyboard-k380/gallery/k380-lavender-gallery-1-us.png?v=1',
+ category_id: 4,
+ },
+ {
+ title: 'Portable Power Bank',
+ price: 29,
+ description: `Stay charged wherever you go with the Portable Power Bank.`,
+ stock_left: 200,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://luckystore.com.sg/wp-content/uploads/2022/04/ORABEL-ORP-10-6.jpg',
+ category_id: 4,
+ },
+ {
+ title: 'Camera Lens Kit',
+ price: 149,
+ description: `Capture stunning photos with the Camera Lens Kit.`,
+ stock_left: 70,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://improvephotography.com/wp-content/uploads/2011/10/AF-S_NIKKOR_28-300mm_f3.5-5.6G_ED_VR.jpg',
+ category_id: 4,
+ },
+ {
+ title: 'Wireless Mouse',
+ price: 49,
+ description: `Upgrade your computing experience with the Wireless Mouse.`,
+ stock_left: 110,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://img.ws.mms.shopee.sg/ff053fb4aba3183a584a6dd8ca23552f',
+ category_id: 4,
+ },
+ {
+ title: 'iPad Pro 2023',
+ price: 799,
+ description: `Experience the power of the iPad Pro 2023.`,
+ stock_left: 80,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://changiairport.scene7.com/is/image/changiairport/mp00176080-1-apple-1666691387743-apple-ipad-pro-12-9--6th-gen--wi-fi---cellular-128gb-silver?$2x$',
+ category_id: 5,
+ },
+ {
+ title: 'Galaxy Tab S8 Ultra',
+ price: 999,
+ description: `Immerse yourself in entertainment with the Galaxy Tab S8 Ultra.`,
+ stock_left: 70,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://images.samsung.com/is/image/samsung/p6pim/sg/sm-x906bzajxsp/gallery/sg-galaxy-tab-s8-ultra-5g-x906-sm-x906bzajxsp-534194325?$650_519_PNG$',
+ category_id: 5,
+ },
+ {
+ title: 'Surface Pro 10',
+ price: 1299,
+ description: `Unleash your creativity with the Surface Pro 10.`,
+ stock_left: 60,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/71zBExi4RTL._AC_UF894,1000_QL80_.jpg',
+ category_id: 5,
+ },
+ {
+ title: 'Fire HD 12',
+ price: 299,
+ description: `Enjoy entertainment on the go with the Fire HD 12.`,
+ stock_left: 100,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://wmart.com.sg//image/cache/catalog/Wmart%20Live/Product/Amazon/Fire%20HD%2010%202021/website-black-512x299.jpg',
+ category_id: 5,
+ },
+ {
+ title: 'Xperia Tab 5',
+ price: 499,
+ description: `Experience entertainment like never before with the Xperia Tab 5.`,
+ stock_left: 90,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://akm-img-a-in.tosshub.com/businesstoday/images/story/201307/sony-xperia-z-tablet_505_071613125233.jpg?size=948:533',
+ category_id: 5,
+ },
+ {
+ title: 'Lenovo Tab P12 Pro',
+ price: 699,
+ description: `Stay productive and entertained with the Lenovo Tab P12 Pro.`,
+ stock_left: 50,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/61Yj0rzrpeL._AC_UF894,1000_QL80_.jpg',
+ category_id: 5,
+ },
+ {
+ title: 'Huawei MatePad Pro 2022',
+ price: 899,
+ description: `Unlock your creativity with the Huawei MatePad Pro 2022.`,
+ stock_left: 45,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://consumer.huawei.com/content/dam/huawei-cbg-site/common/mkt/pdp/tablets/matepad-pro-13-2/img/hero/en-kv/huawei-matepad-pro-13-2-kv.jpg',
+ category_id: 5,
+ },
+ {
+ title: 'Google Pixel Slate 2',
+ price: 799,
+ description: `Experience the best of Google with the Pixel Slate 2.`,
+ stock_left: 55,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/71k+KbTBn5L._AC_UF894,1000_QL80_.jpg',
+ category_id: 5,
+ },
+ ],
+ {},
+ );
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add commands to revert seed here.
+ *
+ * Example:
+ * await queryInterface.bulkDelete('People', null, {});
+ */
+ await queryInterface.bulkDelete('products', null, {});
+ },
+};
diff --git a/db/seeders/20240316131227-seed-orders.js b/db/seeders/20240316131227-seed-orders.js
new file mode 100644
index 00000000..78f707b4
--- /dev/null
+++ b/db/seeders/20240316131227-seed-orders.js
@@ -0,0 +1,40 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add seed commands here.
+ *
+ * Example:
+ * await queryInterface.bulkInsert('People', [{
+ * name: 'John Doe',
+ * isBetaMember: false
+ * }], {});
+ */
+ await queryInterface.bulkInsert('orders', [
+ {
+ delivery_address: 'Plaza Singapura',
+ created_at: new Date(),
+ updated_at: new Date(),
+ user_id: 16,
+ },
+ {
+ delivery_address: 'Orchard Road',
+ created_at: new Date(),
+ updated_at: new Date(),
+ user_id: 17,
+ },
+ ]);
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add commands to revert seed here.
+ *
+ * Example:
+ * await queryInterface.bulkDelete('People', null, {});
+ */
+ await queryInterface.bulkDelete('orders', null, {});
+ },
+};
diff --git a/db/seeders/20240317081200-seed-addresses.js b/db/seeders/20240317081200-seed-addresses.js
new file mode 100644
index 00000000..c5a3da98
--- /dev/null
+++ b/db/seeders/20240317081200-seed-addresses.js
@@ -0,0 +1,44 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add seed commands here.
+ *
+ * Example:
+ * await queryInterface.bulkInsert('People', [{
+ * name: 'John Doe',
+ * isBetaMember: false
+ * }], {});
+ */
+ await queryInterface.bulkInsert(
+ 'addresses',
+ [
+ {
+ buyer_id: 16,
+ address: '123 Ang Mo Kio Avenue 4, #07-123, Singapore 560123',
+ created_at: new Date(),
+ updated_at: new Date(),
+ },
+ {
+ buyer_id: 17,
+ address: '456 Jurong West Street 52, #12-345, Singapore 640456',
+ created_at: new Date(),
+ updated_at: new Date(),
+ },
+ ],
+ {},
+ );
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add commands to revert seed here.
+ *
+ * Example:
+ * await queryInterface.bulkDelete('People', null, {});
+ */
+ await queryInterface.bulkDelete('addresses', null, {});
+ },
+};
diff --git a/db/seeders/20240402125001-update-remaining-stripeIds.js b/db/seeders/20240402125001-update-remaining-stripeIds.js
new file mode 100644
index 00000000..0a876e47
--- /dev/null
+++ b/db/seeders/20240402125001-update-remaining-stripeIds.js
@@ -0,0 +1,226 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add seed commands here.
+ *
+ * Example:
+ * await queryInterface.bulkInsert('People', [{
+ * name: 'John Doe',
+ * isBetaMember: false
+ * }], {});
+ */
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRM8Ce2bVtqVUUKsqiHOpR' },
+ { id: 1 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRByCe2bVtqVUUcIgjucVt' },
+ { id: 2 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyFtTCe2bVtqVUUkib369iz' },
+ { id: 3 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRI5Ce2bVtqVUUPeZY68jl' },
+ { id: 4 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyFtTCe2bVtqVUUs4HXpNpU' },
+ { id: 5 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyFtTCe2bVtqVUUm0qJ43ym' },
+ { id: 6 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR5cCe2bVtqVUU55qo1Lig' },
+ { id: 7 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRB8Ce2bVtqVUU3auJ56ve' },
+ { id: 8 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRMcCe2bVtqVUUOyhTG0l0' },
+ { id: 9 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR7yCe2bVtqVUUEE0W130j' },
+ { id: 10 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR9HCe2bVtqVUU0PYKdaQi' },
+ { id: 11 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRJ5Ce2bVtqVUUMk79xSnA' },
+ { id: 12 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR8QCe2bVtqVUUgPkkKJk8' },
+ { id: 13 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR9oCe2bVtqVUUdciEKd2x' },
+ { id: 14 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyHThCe2bVtqVUUA9BDZblq' },
+ { id: 15 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR8vCe2bVtqVUUNVK1L4VQ' },
+ { id: 16 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRIRCe2bVtqVUU77Ido4Ac' },
+ { id: 17 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRA4Ce2bVtqVUUzzESOhSs' },
+ { id: 18 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR28Ce2bVtqVUUGj5M0upu' },
+ { id: 19 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRIiCe2bVtqVUUcczlnGf5' },
+ { id: 20 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyFtTCe2bVtqVUUvpaqx3UT' },
+ { id: 21 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR9XCe2bVtqVUUOqM8o1ND' },
+ { id: 22 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRAVCe2bVtqVUUKQ4SE0OT' },
+ { id: 23 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR8gCe2bVtqVUUKy5eNKog' },
+ { id: 24 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR2VCe2bVtqVUUjucQXMJV' },
+ { id: 25 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyHThCe2bVtqVUUuUch4O2I' },
+ { id: 26 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyR5FCe2bVtqVUU6V2MTz9y' },
+ { id: 27 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyRJQCe2bVtqVUUGVRG791B' },
+ { id: 28 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyQnICe2bVtqVUURNgeoZPs' },
+ { id: 29 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyHThCe2bVtqVUUwO4b89vb' },
+ { id: 30 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyFtTCe2bVtqVUUWXCwBaBo' },
+ { id: 31 },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: 'price_1OyHThCe2bVtqVUUbi2eVzKJ' },
+ { id: 32 },
+ );
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add commands to revert seed here.
+ *
+ * Example:
+ * await queryInterface.bulkDelete('People', null, {});
+ */
+ await queryInterface.bulkUpdate(
+ 'products',
+ { stripe_id: null },
+ {
+ id: [
+ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ ],
+ },
+ );
+ },
+};
diff --git a/db/seeders/20240414075912-seed-flagship-products.js b/db/seeders/20240414075912-seed-flagship-products.js
new file mode 100644
index 00000000..39617e48
--- /dev/null
+++ b/db/seeders/20240414075912-seed-flagship-products.js
@@ -0,0 +1,79 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add seed commands here.
+ *
+ * Example:
+ * await queryInterface.bulkInsert('People', [{
+ * name: 'John Doe',
+ * isBetaMember: false
+ * }], {});
+ */
+ await queryInterface.bulkInsert('products', [
+ {
+ title: 'Alienware Laptop',
+ price: 3500,
+ description:
+ 'Unleash the ultimate gaming supremacy with the Alienware Laptop, where lightning-fast performance meets unbeatable power for the most immersive gaming experience ever.',
+ stock_left: 30,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://m.media-amazon.com/images/I/71PSUjIQKDS._AC_UF894,1000_QL80_.jpg',
+ category_id: 2,
+ },
+ {
+ title: 'Pear IPhone X',
+ price: 1200,
+ description:
+ 'Experience unparalleled performance with the iPhone, where every tap, swipe, and game takes you on a journey of unrivaled speed and seamless entertainment.',
+ stock_left: 100,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://www.courts.com.sg/media/catalog/product/i/p/ip186838_00.jpg?quality=80&bg-color=255,255,255&fit=bounds&height=770&width=770&canvas=770:770',
+ category_id: 3,
+ },
+ {
+ title: 'Pear Vision Pro',
+ price: 5000,
+ description:
+ 'Dive into a realm of boundless exploration with the Apple Vision Pro VR, where unparalleled performance and stunning visuals merge to redefine the way you experience virtual reality',
+ stock_left: 28,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://www.apple.com/newsroom/images/media/introducing-apple-vision-pro/Apple-WWDC23-Vision-Pro-with-battery-230605_big.jpg.large.jpg',
+ category_id: 4,
+ },
+ {
+ title: 'Cyberpunk Tablet',
+ price: 10000,
+ description:
+ 'Immerse yourself in the neon-lit streets of Night City with the Cyberpunk 2077 Tablet, where unparalleled performance and cutting-edge visuals transport you into a dystopian future like never before.',
+ stock_left: 10,
+ created_at: new Date(),
+ updated_at: new Date(),
+ img: 'https://i.imgur.com/id31Xn1.png',
+ category_id: 5,
+ },
+ ]);
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add commands to revert seed here.
+ *
+ * Example:
+ * await queryInterface.bulkDelete('People', null, {});
+ */
+ await queryInterface.bulkDelete('products', {
+ title: [
+ 'Alienware Laptop',
+ 'Pear IPhone X',
+ 'Pear Vision Pro',
+ 'Cyberpunk Tablet',
+ ],
+ });
+ },
+};
diff --git a/db/seeders/20240416023043-stripe-id-flagship.js b/db/seeders/20240416023043-stripe-id-flagship.js
new file mode 100644
index 00000000..3eb5ecbf
--- /dev/null
+++ b/db/seeders/20240416023043-stripe-id-flagship.js
@@ -0,0 +1,71 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ /**
+ * Add seed commands here.
+ *
+ * Example:
+ * await queryInterface.bulkInsert('People', [{
+ * name: 'John Doe',
+ * isBetaMember: false
+ * }], {});
+ */
+ await queryInterface.bulkUpdate(
+ 'products',
+ {
+ stripe_id: 'price_1P61sJCe2bVtqVUUawoyhJpq',
+ },
+ { title: 'Alienware Laptop' },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ {
+ stripe_id: 'price_1P61v9Ce2bVtqVUUIJPrnEUq',
+ },
+ { title: 'Pear IPhone X' },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ {
+ stripe_id: 'price_1P61wUCe2bVtqVUUS1QaN3IW',
+ },
+ { title: 'Pear Vision Pro' },
+ );
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ {
+ stripe_id: 'price_1P61xaCe2bVtqVUUevvjkaO6',
+ },
+ { title: 'Cyberpunk Tablet' },
+ );
+ },
+
+ async down(queryInterface, Sequelize) {
+ /**
+ * Add commands to revert seed here.
+ *
+ * Example:
+ * await queryInterface.bulkDelete('People', null, {});
+ */
+
+ await queryInterface.bulkUpdate(
+ 'products',
+ {
+ stripe_id: null,
+ },
+ {
+ title: [
+ 'Alienware Laptop',
+ 'Pear IPhone X',
+ 'Pear Vision Pro',
+ 'Cyberpunk Tablet',
+ ],
+ },
+ );
+ },
+};
diff --git a/index.js b/index.js
index 3fd92432..da39db1d 100644
--- a/index.js
+++ b/index.js
@@ -1,11 +1,78 @@
-import express from "express";
+const express = require("express");
+require("dotenv").config();
+const cors = require("cors");
+const { auth } = require("express-oauth2-jwt-bearer");
+require("dotenv").config();
+
+const checkJwt = auth({
+ audience: process.env.AUDIENCE,
+ issuerBaseURL: process.env.ISSUER_BASE_URL,
+ tokenSigningAlg: process.env.TOKEN_SIGNING_ALG,
+});
+
+// import Routers
+const ProductsRouter = require("./routers/productsRouter");
+const OrdersRouter = require("./routers/ordersRouter");
+const CategoriesRouter = require("./routers/categoriesRouter");
+const UsersRouter = require("./routers/usersRouter");
+const AddressesRouter = require("./routers/addressesRouter");
+
+// import Controllers
+const ProductsController = require("./controllers/productsController");
+const OrdersController = require("./controllers/ordersController");
+const CategoriesController = require("./controllers/categoriesController");
+const UsersController = require("./controllers/usersController");
+const AddressesController = require("./controllers/addressesController");
+
+// importing DB
+const db = require("./db/models/index");
+
+const { product, user, order, category, address, order_products } = db;
+
+// Initializing Controllers
+const productsController = new ProductsController(product, order, category);
+const ordersController = new OrdersController(
+ order,
+ user,
+ product,
+ order_products,
+ address
+);
+const categoriesController = new CategoriesController(category);
+const usersController = new UsersController(user);
+const addressesController = new AddressesController(address, user);
+
+// Initializing Routers
+const productsRouter = new ProductsRouter(
+ productsController,
+ checkJwt
+).routes();
+const ordersRouter = new OrdersRouter(ordersController).routes();
+const categoriesRouter = new CategoriesRouter(categoriesController).routes();
+const usersRouter = new UsersRouter(usersController).routes();
+const addressesRouter = new AddressesRouter(addressesController).routes();
const PORT = 3000;
const app = express();
-app.get("/", (req, res) => {
- res.send("Hello, World!");
-});
+app.use(cors());
+
+// Handle preflight OPTIONS requests
+app.options(
+ "*",
+ cors({
+ origin: "http://localhost:5173",
+ })
+);
+
+app.use(express.json());
+
+// Enable and use router
+app.use("/products", productsRouter);
+app.use("/orders", ordersRouter);
+app.use("/categories", categoriesRouter);
+app.use("/users", usersRouter);
+app.use("/addresses", addressesRouter);
app.listen(PORT, () => {
console.log(`Express app listening on port ${PORT}!`);
diff --git a/package-lock.json b/package-lock.json
index bc0ea392..cf361834 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,10 +8,19 @@
"name": "project3-backend-bootcamp",
"version": "1.0.0",
"dependencies": {
- "express": "^4.18.1"
+ "cors": "^2.8.5",
+ "dotenv": "^16.4.5",
+ "express": "^4.18.1",
+ "express-oauth2-jwt-bearer": "^1.6.0",
+ "node-mailjet": "^6.0.5",
+ "nodemailer": "^6.9.13",
+ "pg": "^8.11.3",
+ "sequelize": "^6.37.1",
+ "stripe": "^14.22.0"
},
"devDependencies": {
- "eslint": "^8.16.0"
+ "eslint": "^8.16.0",
+ "sequelize-cli": "^6.6.2"
}
},
"node_modules/@eslint/eslintrc": {
@@ -100,6 +109,153 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@one-ini/wasm": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
+ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
+ "dev": true
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "0.7.34",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
+ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.28",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz",
+ "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/validator": {
+ "version": "13.11.9",
+ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz",
+ "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw=="
+ },
+ "node_modules/abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
@@ -184,12 +340,50 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
+ "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "node_modules/bignumber.js": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz",
+ "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
"node_modules/body-parser": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
@@ -223,6 +417,14 @@
"concat-map": "0.0.1"
}
},
+ "node_modules/buffer-writer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+ "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -232,12 +434,18 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -268,6 +476,33 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/cli-color": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz",
+ "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==",
+ "dev": true,
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.64",
+ "es6-iterator": "^2.0.3",
+ "memoizee": "^0.4.15",
+ "timers-ext": "^0.1.7"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -286,12 +521,42 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -324,6 +589,18 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -338,6 +615,19 @@
"node": ">= 8"
}
},
+ "node_modules/d": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+ "dev": true,
+ "dependencies": {
+ "es5-ext": "^0.10.64",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -352,6 +642,30 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -381,11 +695,81 @@
"node": ">=6.0.0"
}
},
+ "node_modules/dotenv": {
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dottie": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
+ "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/editorconfig": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
+ "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==",
+ "dev": true,
+ "dependencies": {
+ "@one-ini/wasm": "0.1.1",
+ "commander": "^10.0.0",
+ "minimatch": "9.0.1",
+ "semver": "^7.5.3"
+ },
+ "bin": {
+ "editorconfig": "bin/editorconfig"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/editorconfig/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/editorconfig/node_modules/minimatch": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+ "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@@ -394,6 +778,86 @@
"node": ">= 0.8"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es5-ext": {
+ "version": "0.10.64",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "esniff": "^2.0.1",
+ "next-tick": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "dev": true,
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/es6-symbol": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+ "dev": true,
+ "dependencies": {
+ "d": "^1.0.2",
+ "ext": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/es6-weak-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
+ "dev": true,
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.46",
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -535,6 +999,21 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "node_modules/esniff": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+ "dev": true,
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.62",
+ "event-emitter": "^0.3.5",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/espree": {
"version": "9.3.2",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
@@ -599,6 +1078,16 @@
"node": ">= 0.6"
}
},
+ "node_modules/event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "dev": true,
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
"node_modules/express": {
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
@@ -640,6 +1129,26 @@
"node": ">= 0.10.0"
}
},
+ "node_modules/express-oauth2-jwt-bearer": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/express-oauth2-jwt-bearer/-/express-oauth2-jwt-bearer-1.6.0.tgz",
+ "integrity": "sha512-HXnez7vocYlOqlfF3ozPcf/WE3zxT7zfUNfeg5FHJnvNwhBYlNXiPOvuCtBalis8xcigvwtInzEKhBuH87+9ug==",
+ "dependencies": {
+ "jose": "^4.13.1"
+ },
+ "engines": {
+ "node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0 || ^20.2.0"
+ }
+ },
+ "node_modules/ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "dev": true,
+ "dependencies": {
+ "type": "^2.7.2"
+ }
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -706,22 +1215,85 @@
"integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
"dev": true
},
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
"engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"engines": {
"node": ">= 0.6"
}
},
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -729,9 +1301,12 @@
"dev": true
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/functional-red-black-tree": {
"version": "1.0.1",
@@ -739,14 +1314,28 @@
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
"node_modules/get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -799,17 +1388,23 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dependencies": {
- "function-bind": "^1.1.1"
+ "get-intrinsic": "^1.1.3"
},
- "engines": {
- "node": ">= 0.4.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -819,6 +1414,28 @@
"node": ">=8"
}
},
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@@ -830,6 +1447,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -890,6 +1518,14 @@
"node": ">=0.8.19"
}
},
+ "node_modules/inflection": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
+ "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",
+ "engines": [
+ "node >= 0.4.0"
+ ]
+ },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -905,6 +1541,12 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
"node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -913,6 +1555,18 @@
"node": ">= 0.10"
}
},
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -922,6 +1576,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -934,12 +1597,120 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-promise": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
+ "dev": true
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
+ "node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jose": {
+ "version": "4.15.5",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz",
+ "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/js-beautify": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz",
+ "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==",
+ "dev": true,
+ "dependencies": {
+ "config-chain": "^1.1.13",
+ "editorconfig": "^1.0.4",
+ "glob": "^10.3.3",
+ "js-cookie": "^3.0.5",
+ "nopt": "^7.2.0"
+ },
+ "bin": {
+ "css-beautify": "js/bin/css-beautify.js",
+ "html-beautify": "js/bin/html-beautify.js",
+ "js-beautify": "js/bin/js-beautify.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/js-beautify/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/js-beautify/node_modules/glob": {
+ "version": "10.3.10",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.5",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "path-scurry": "^1.10.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/js-beautify/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/js-cookie": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
+ "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -952,6 +1723,14 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "dependencies": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -964,6 +1743,18 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -977,12 +1768,37 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lru-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
+ "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
+ "dev": true,
+ "dependencies": {
+ "es5-ext": "~0.10.2"
+ }
+ },
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -991,6 +1807,22 @@
"node": ">= 0.6"
}
},
+ "node_modules/memoizee": {
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
+ "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
+ "dev": true,
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.53",
+ "es6-weak-map": "^2.0.3",
+ "event-emitter": "^0.3.5",
+ "is-promise": "^2.2.2",
+ "lru-queue": "^0.1.0",
+ "next-tick": "^1.1.0",
+ "timers-ext": "^0.1.7"
+ }
+ },
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -1046,6 +1878,34 @@
"node": "*"
}
},
+ "node_modules/minipass": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+ "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment-timezone": {
+ "version": "0.5.45",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz",
+ "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==",
+ "dependencies": {
+ "moment": "^2.29.4"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -1065,10 +1925,61 @@
"node": ">= 0.6"
}
},
+ "node_modules/next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
+ "dev": true
+ },
+ "node_modules/node-mailjet": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/node-mailjet/-/node-mailjet-6.0.5.tgz",
+ "integrity": "sha512-upufsTkMyrDF7Z6OiJ4M4Yw4L6MkB0vOQB27W1V9q0CxxSA6e2xOJif3koPwwwgDELpbJNG7asZjKFdghtxUCw==",
+ "dependencies": {
+ "axios": "1.6.2",
+ "json-bigint": "^1.0.0",
+ "url-join": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "npm": ">= 6.9.0"
+ }
+ },
+ "node_modules/nodemailer": {
+ "version": "6.9.13",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz",
+ "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz",
+ "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/object-inspect": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz",
- "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==",
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -1110,6 +2021,11 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/packet-reader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+ "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -1148,11 +2064,160 @@
"node": ">=8"
}
},
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-scurry": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+ "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^9.1.1 || ^10.0.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
+ "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
+ "dev": true,
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
+ "node_modules/pg": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz",
+ "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==",
+ "dependencies": {
+ "buffer-writer": "2.0.0",
+ "packet-reader": "1.0.0",
+ "pg-connection-string": "^2.6.2",
+ "pg-pool": "^3.6.1",
+ "pg-protocol": "^1.6.0",
+ "pg-types": "^2.1.0",
+ "pgpass": "1.x"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "optionalDependencies": {
+ "pg-cloudflare": "^1.1.1"
+ },
+ "peerDependencies": {
+ "pg-native": ">=3.0.1"
+ },
+ "peerDependenciesMeta": {
+ "pg-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pg-cloudflare": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
+ "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
+ "optional": true
+ },
+ "node_modules/pg-connection-string": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
+ "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="
+ },
+ "node_modules/pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/pg-pool": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz",
+ "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==",
+ "peerDependencies": {
+ "pg": ">=8.0"
+ }
+ },
+ "node_modules/pg-protocol": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
+ "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
+ },
+ "node_modules/pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "dependencies": {
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pgpass": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+ "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "dependencies": {
+ "split2": "^4.1.0"
+ }
+ },
+ "node_modules/postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postgres-bytea": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+ "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -1162,6 +2227,12 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "dev": true
+ },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -1174,6 +2245,11 @@
"node": ">= 0.10"
}
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
@@ -1231,6 +2307,32 @@
"url": "https://github.com/sponsors/mysticatea"
}
},
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -1240,6 +2342,11 @@
"node": ">=4"
}
},
+ "node_modules/retry-as-promised": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
+ "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
+ },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -1279,6 +2386,20 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
+ "node_modules/semver": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
@@ -1307,6 +2428,118 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
+ "node_modules/sequelize": {
+ "version": "6.37.1",
+ "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz",
+ "integrity": "sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/sequelize"
+ }
+ ],
+ "dependencies": {
+ "@types/debug": "^4.1.8",
+ "@types/validator": "^13.7.17",
+ "debug": "^4.3.4",
+ "dottie": "^2.0.6",
+ "inflection": "^1.13.4",
+ "lodash": "^4.17.21",
+ "moment": "^2.29.4",
+ "moment-timezone": "^0.5.43",
+ "pg-connection-string": "^2.6.1",
+ "retry-as-promised": "^7.0.4",
+ "semver": "^7.5.4",
+ "sequelize-pool": "^7.1.0",
+ "toposort-class": "^1.0.1",
+ "uuid": "^8.3.2",
+ "validator": "^13.9.0",
+ "wkx": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ibm_db": {
+ "optional": true
+ },
+ "mariadb": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "oracledb": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "pg-hstore": {
+ "optional": true
+ },
+ "snowflake-sdk": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ },
+ "tedious": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sequelize-cli": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz",
+ "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==",
+ "dev": true,
+ "dependencies": {
+ "cli-color": "^2.0.3",
+ "fs-extra": "^9.1.0",
+ "js-beautify": "^1.14.5",
+ "lodash": "^4.17.21",
+ "resolve": "^1.22.1",
+ "umzug": "^2.3.0",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "sequelize": "lib/sequelize",
+ "sequelize-cli": "lib/sequelize"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/sequelize-pool": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
+ "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/sequelize/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sequelize/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
@@ -1321,6 +2554,22 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -1348,18 +2597,42 @@
}
},
"node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
@@ -1368,7 +2641,49 @@
"node": ">= 0.8"
}
},
- "node_modules/strip-ansi": {
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
@@ -1392,6 +2707,32 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/stripe": {
+ "version": "14.22.0",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.22.0.tgz",
+ "integrity": "sha512-Pj8SAdTNjMq42UnWzBTTy8KMQ8qbQoVemPHbw3x+rHvwq1Psg9UFPT58j54F5os/SCgUAOZSEMcUedvzIDuqvw==",
+ "dependencies": {
+ "@types/node": ">=8.1.0",
+ "qs": "^6.11.0"
+ },
+ "engines": {
+ "node": ">=12.*"
+ }
+ },
+ "node_modules/stripe/node_modules/qs": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz",
+ "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -1404,12 +2745,34 @@
"node": ">=8"
}
},
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
+ "node_modules/timers-ext": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
+ "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
+ "dev": true,
+ "dependencies": {
+ "es5-ext": "~0.10.46",
+ "next-tick": "1"
+ }
+ },
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -1418,6 +2781,17 @@
"node": ">=0.6"
}
},
+ "node_modules/toposort-class": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
+ "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg=="
+ },
+ "node_modules/type": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
+ "dev": true
+ },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -1454,6 +2828,32 @@
"node": ">= 0.6"
}
},
+ "node_modules/umzug": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz",
+ "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==",
+ "dev": true,
+ "dependencies": {
+ "bluebird": "^3.7.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -1471,6 +2871,11 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/url-join": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
+ },
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -1479,12 +2884,28 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
+ "node_modules/validator": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
+ "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -1508,6 +2929,14 @@
"node": ">= 8"
}
},
+ "node_modules/wkx": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
+ "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -1517,11 +2946,95 @@
"node": ">=0.10.0"
}
},
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
}
},
"dependencies": {
@@ -1593,6 +3106,116 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "requires": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ }
+ }
+ }
+ },
+ "@one-ini/wasm": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
+ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
+ "dev": true
+ },
+ "@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true
+ },
+ "@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "requires": {
+ "@types/ms": "*"
+ }
+ },
+ "@types/ms": {
+ "version": "0.7.34",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
+ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
+ },
+ "@types/node": {
+ "version": "20.11.28",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz",
+ "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==",
+ "requires": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "@types/validator": {
+ "version": "13.11.9",
+ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz",
+ "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw=="
+ },
+ "abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "dev": true
+ },
"accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
@@ -1653,12 +3276,44 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true
+ },
+ "axios": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
+ "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
+ "requires": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "bignumber.js": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz",
+ "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
"body-parser": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
@@ -1688,18 +3343,26 @@
"concat-map": "0.0.1"
}
},
+ "buffer-writer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+ "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
+ },
"bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
},
"call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
}
},
"callsites": {
@@ -1718,6 +3381,30 @@
"supports-color": "^7.1.0"
}
},
+ "cli-color": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz",
+ "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==",
+ "dev": true,
+ "requires": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.64",
+ "es6-iterator": "^2.0.3",
+ "memoizee": "^0.4.15",
+ "timers-ext": "^0.1.7"
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1733,12 +3420,36 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
+ "config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
"content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -1762,6 +3473,15 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -1773,6 +3493,16 @@
"which": "^2.0.1"
}
},
+ "d": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+ "dev": true,
+ "requires": {
+ "es5-ext": "^0.10.64",
+ "type": "^2.7.2"
+ }
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -1787,6 +3517,21 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
+ "define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "requires": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -1806,16 +3551,134 @@
"esutils": "^2.0.2"
}
},
+ "dotenv": {
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg=="
+ },
+ "dottie": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
+ "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
+ },
+ "eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "editorconfig": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
+ "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==",
+ "dev": true,
+ "requires": {
+ "@one-ini/wasm": "0.1.1",
+ "commander": "^10.0.0",
+ "minimatch": "9.0.1",
+ "semver": "^7.5.3"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+ "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
+ "es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "requires": {
+ "get-intrinsic": "^1.2.4"
+ }
+ },
+ "es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+ },
+ "es5-ext": {
+ "version": "0.10.64",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "esniff": "^2.0.1",
+ "next-tick": "^1.1.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+ "dev": true,
+ "requires": {
+ "d": "^1.0.2",
+ "ext": "^1.7.0"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.46",
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dev": true
+ },
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -1920,6 +3783,18 @@
"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
"dev": true
},
+ "esniff": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+ "dev": true,
+ "requires": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.62",
+ "event-emitter": "^0.3.5",
+ "type": "^2.7.2"
+ }
+ },
"espree": {
"version": "9.3.2",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
@@ -1966,6 +3841,16 @@
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
"express": {
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
@@ -2004,6 +3889,23 @@
"vary": "~1.1.2"
}
},
+ "express-oauth2-jwt-bearer": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/express-oauth2-jwt-bearer/-/express-oauth2-jwt-bearer-1.6.0.tgz",
+ "integrity": "sha512-HXnez7vocYlOqlfF3ozPcf/WE3zxT7zfUNfeg5FHJnvNwhBYlNXiPOvuCtBalis8xcigvwtInzEKhBuH87+9ug==",
+ "requires": {
+ "jose": "^4.13.1"
+ }
+ },
+ "ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "dev": true,
+ "requires": {
+ "type": "^2.7.2"
+ }
+ },
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -2061,6 +3963,31 @@
"integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
"dev": true
},
+ "follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
+ },
+ "foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ }
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -2071,6 +3998,18 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -2078,9 +4017,9 @@
"dev": true
},
"function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"functional-red-black-tree": {
"version": "1.0.1",
@@ -2088,14 +4027,22 @@
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
"get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
}
},
"glob": {
@@ -2130,25 +4077,52 @@
"type-fest": "^0.20.2"
}
},
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"requires": {
- "function-bind": "^1.1.1"
+ "get-intrinsic": "^1.1.3"
}
},
+ "graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "requires": {
+ "es-define-property": "^1.0.0"
+ }
+ },
+ "has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
+ },
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
+ "hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "requires": {
+ "function-bind": "^1.1.2"
+ }
+ },
"http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -2191,6 +4165,11 @@
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
+ "inflection": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
+ "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw=="
+ },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -2206,17 +4185,38 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
+ "ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
+ "is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dev": true,
+ "requires": {
+ "hasown": "^2.0.0"
+ }
+ },
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -2226,12 +4226,85 @@
"is-extglob": "^2.1.1"
}
},
+ "is-promise": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
+ "dev": true
+ },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
+ "jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dev": true,
+ "requires": {
+ "@isaacs/cliui": "^8.0.2",
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "jose": {
+ "version": "4.15.5",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz",
+ "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg=="
+ },
+ "js-beautify": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz",
+ "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==",
+ "dev": true,
+ "requires": {
+ "config-chain": "^1.1.13",
+ "editorconfig": "^1.0.4",
+ "glob": "^10.3.3",
+ "js-cookie": "^3.0.5",
+ "nopt": "^7.2.0"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "10.3.10",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+ "dev": true,
+ "requires": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.5",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "path-scurry": "^1.10.1"
+ }
+ },
+ "minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "js-cookie": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
+ "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
+ "dev": true
+ },
"js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -2241,6 +4314,14 @@
"argparse": "^2.0.1"
}
},
+ "json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "requires": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -2253,6 +4334,16 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
"levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -2263,17 +4354,55 @@
"type-check": "~0.4.0"
}
},
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
"lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "lru-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
+ "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
+ "dev": true,
+ "requires": {
+ "es5-ext": "~0.10.2"
+ }
+ },
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
+ "memoizee": {
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
+ "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
+ "dev": true,
+ "requires": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.53",
+ "es6-weak-map": "^2.0.3",
+ "event-emitter": "^0.3.5",
+ "is-promise": "^2.2.2",
+ "lru-queue": "^0.1.0",
+ "next-tick": "^1.1.0",
+ "timers-ext": "^0.1.7"
+ }
+ },
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -2311,6 +4440,25 @@
"brace-expansion": "^1.1.7"
}
},
+ "minipass": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+ "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+ "dev": true
+ },
+ "moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
+ },
+ "moment-timezone": {
+ "version": "0.5.45",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz",
+ "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==",
+ "requires": {
+ "moment": "^2.29.4"
+ }
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -2327,10 +4475,45 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
},
+ "next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
+ "dev": true
+ },
+ "node-mailjet": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/node-mailjet/-/node-mailjet-6.0.5.tgz",
+ "integrity": "sha512-upufsTkMyrDF7Z6OiJ4M4Yw4L6MkB0vOQB27W1V9q0CxxSA6e2xOJif3koPwwwgDELpbJNG7asZjKFdghtxUCw==",
+ "requires": {
+ "axios": "1.6.2",
+ "json-bigint": "^1.0.0",
+ "url-join": "^4.0.0"
+ }
+ },
+ "nodemailer": {
+ "version": "6.9.13",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz",
+ "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA=="
+ },
+ "nopt": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz",
+ "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==",
+ "dev": true,
+ "requires": {
+ "abbrev": "^2.0.0"
+ }
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+ },
"object-inspect": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz",
- "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA=="
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
},
"on-finished": {
"version": "2.4.1",
@@ -2363,6 +4546,11 @@
"word-wrap": "^1.2.3"
}
},
+ "packet-reader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+ "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+ },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -2389,17 +4577,132 @@
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "path-scurry": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+ "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^9.1.1 || ^10.0.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
+ "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
+ "dev": true
+ }
+ }
+ },
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
+ "pg": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz",
+ "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==",
+ "requires": {
+ "buffer-writer": "2.0.0",
+ "packet-reader": "1.0.0",
+ "pg-cloudflare": "^1.1.1",
+ "pg-connection-string": "^2.6.2",
+ "pg-pool": "^3.6.1",
+ "pg-protocol": "^1.6.0",
+ "pg-types": "^2.1.0",
+ "pgpass": "1.x"
+ }
+ },
+ "pg-cloudflare": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
+ "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
+ "optional": true
+ },
+ "pg-connection-string": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
+ "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="
+ },
+ "pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
+ },
+ "pg-pool": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz",
+ "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==",
+ "requires": {}
+ },
+ "pg-protocol": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
+ "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
+ },
+ "pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "requires": {
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
+ }
+ },
+ "pgpass": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+ "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "requires": {
+ "split2": "^4.1.0"
+ }
+ },
+ "postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
+ },
+ "postgres-bytea": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+ "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="
+ },
+ "postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="
+ },
+ "postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "requires": {
+ "xtend": "^4.0.0"
+ }
+ },
"prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
+ "proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "dev": true
+ },
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -2409,6 +4712,11 @@
"ipaddr.js": "1.9.1"
}
},
+ "proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
@@ -2445,12 +4753,34 @@
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true
},
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
},
+ "retry-as-promised": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
+ "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
+ },
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -2470,6 +4800,14 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
+ "semver": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
"send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
@@ -2497,6 +4835,64 @@
}
}
},
+ "sequelize": {
+ "version": "6.37.1",
+ "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz",
+ "integrity": "sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw==",
+ "requires": {
+ "@types/debug": "^4.1.8",
+ "@types/validator": "^13.7.17",
+ "debug": "^4.3.4",
+ "dottie": "^2.0.6",
+ "inflection": "^1.13.4",
+ "lodash": "^4.17.21",
+ "moment": "^2.29.4",
+ "moment-timezone": "^0.5.43",
+ "pg-connection-string": "^2.6.1",
+ "retry-as-promised": "^7.0.4",
+ "semver": "^7.5.4",
+ "sequelize-pool": "^7.1.0",
+ "toposort-class": "^1.0.1",
+ "uuid": "^8.3.2",
+ "validator": "^13.9.0",
+ "wkx": "^0.5.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "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=="
+ }
+ }
+ },
+ "sequelize-cli": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz",
+ "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==",
+ "dev": true,
+ "requires": {
+ "cli-color": "^2.0.3",
+ "fs-extra": "^9.1.0",
+ "js-beautify": "^1.14.5",
+ "lodash": "^4.17.21",
+ "resolve": "^1.22.1",
+ "umzug": "^2.3.0",
+ "yargs": "^16.2.0"
+ }
+ },
+ "sequelize-pool": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
+ "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg=="
+ },
"serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
@@ -2508,6 +4904,19 @@
"send": "0.18.0"
}
},
+ "set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "requires": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ }
+ },
"setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -2529,20 +4938,54 @@
"dev": true
},
"side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
}
},
+ "signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true
+ },
+ "split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="
+ },
"statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
},
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "string-width-cjs": {
+ "version": "npm:string-width@4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -2552,12 +4995,40 @@
"ansi-regex": "^5.0.1"
}
},
+ "strip-ansi-cjs": {
+ "version": "npm:strip-ansi@6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
},
+ "stripe": {
+ "version": "14.22.0",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.22.0.tgz",
+ "integrity": "sha512-Pj8SAdTNjMq42UnWzBTTy8KMQ8qbQoVemPHbw3x+rHvwq1Psg9UFPT58j54F5os/SCgUAOZSEMcUedvzIDuqvw==",
+ "requires": {
+ "@types/node": ">=8.1.0",
+ "qs": "^6.11.0"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz",
+ "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==",
+ "requires": {
+ "side-channel": "^1.0.6"
+ }
+ }
+ }
+ },
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -2567,17 +5038,44 @@
"has-flag": "^4.0.0"
}
},
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
+ "timers-ext": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
+ "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
+ "dev": true,
+ "requires": {
+ "es5-ext": "~0.10.46",
+ "next-tick": "1"
+ }
+ },
"toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
},
+ "toposort-class": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
+ "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg=="
+ },
+ "type": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
+ "dev": true
+ },
"type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -2602,6 +5100,26 @@
"mime-types": "~2.1.24"
}
},
+ "umzug": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz",
+ "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.7.2"
+ }
+ },
+ "undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ },
+ "universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true
+ },
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -2616,17 +5134,32 @@
"punycode": "^2.1.0"
}
},
+ "url-join": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
+ },
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+ },
"v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
+ "validator": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
+ "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ=="
+ },
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -2641,17 +5174,84 @@
"isexe": "^2.0.0"
}
},
+ "wkx": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
+ "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "wrap-ansi-cjs": {
+ "version": "npm:wrap-ansi@7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index 09b3bc32..bc344bb4 100644
--- a/package.json
+++ b/package.json
@@ -5,9 +5,18 @@
"start": "nodemon index.js"
},
"dependencies": {
- "express": "^4.18.1"
+ "cors": "^2.8.5",
+ "dotenv": "^16.4.5",
+ "express": "^4.18.1",
+ "express-oauth2-jwt-bearer": "^1.6.0",
+ "node-mailjet": "^6.0.5",
+ "nodemailer": "^6.9.13",
+ "pg": "^8.11.3",
+ "sequelize": "^6.37.1",
+ "stripe": "^14.22.0"
},
"devDependencies": {
- "eslint": "^8.16.0"
+ "eslint": "^8.16.0",
+ "sequelize-cli": "^6.6.2"
}
}
diff --git a/routers/addressesRouter.js b/routers/addressesRouter.js
new file mode 100644
index 00000000..c00d36ed
--- /dev/null
+++ b/routers/addressesRouter.js
@@ -0,0 +1,25 @@
+const express = require('express');
+const router = express.Router();
+
+class AddressesRouter {
+ constructor(controller) {
+ this.controller = controller;
+ }
+
+ routes() {
+ router.get('/', this.controller.getAllAddresses.bind(this.controller));
+ router.post('/', this.controller.postNewAddress.bind(this.controller));
+ router.get(
+ '/get-address-id',
+ this.controller.getAddressIdBasedOnActualAddress.bind(this.controller),
+ );
+ router.get('/:addressId', this.controller.getAddress.bind(this.controller));
+ router.delete(
+ '/:addressId',
+ this.controller.deleteOne.bind(this.controller),
+ );
+ return router;
+ }
+}
+
+module.exports = AddressesRouter;
diff --git a/routers/categoriesRouter.js b/routers/categoriesRouter.js
new file mode 100644
index 00000000..40400bbe
--- /dev/null
+++ b/routers/categoriesRouter.js
@@ -0,0 +1,22 @@
+const express = require('express');
+const router = express.Router();
+
+class CategoriesRouter {
+ constructor(controller) {
+ this.controller = controller;
+ }
+
+ routes() {
+ router.get('/', this.controller.getAll.bind(this.controller));
+ router.get('/:categoryId', this.controller.getOne.bind(this.controller));
+ router.post('/', this.controller.postOne.bind(this.controller));
+ router.put('/:categoryId', this.controller.updateOne.bind(this.controller));
+ router.delete(
+ '/:categoryId',
+ this.controller.deleteOne.bind(this.controller),
+ );
+ return router;
+ }
+}
+
+module.exports = CategoriesRouter;
diff --git a/routers/ordersRouter.js b/routers/ordersRouter.js
new file mode 100644
index 00000000..787b6ee6
--- /dev/null
+++ b/routers/ordersRouter.js
@@ -0,0 +1,22 @@
+const express = require('express');
+const router = express.Router();
+
+class OrdersRouter {
+ constructor(controller) {
+ this.controller = controller;
+ }
+
+ routes() {
+ router.get('/:orderId', this.controller.getOne.bind(this.controller));
+ router.get(
+ '/',
+ this.controller.getAllOrdersOfCurrUser.bind(this.controller),
+ );
+ router.post('/', this.controller.postOne.bind(this.controller));
+ router.delete('/:orderId', this.controller.deleteOne.bind(this.controller));
+
+ return router;
+ }
+}
+
+module.exports = OrdersRouter;
diff --git a/routers/productsRouter.js b/routers/productsRouter.js
new file mode 100644
index 00000000..7c91d917
--- /dev/null
+++ b/routers/productsRouter.js
@@ -0,0 +1,52 @@
+const express = require('express');
+const router = express.Router();
+
+class ProductsRouter {
+ constructor(controller, checkJwt) {
+ this.controller = controller;
+ this.checkJwt = checkJwt;
+ }
+
+ routes() {
+ router.get('/', this.controller.getAll.bind(this.controller));
+ router.get(
+ '/:productId',
+ this.checkJwt,
+ this.controller.getOne.bind(this.controller),
+ );
+ router.put('/:productId', this.controller.updateOne.bind(this.controller));
+ router.post('/', this.controller.postOne.bind(this.controller));
+ router.post(
+ '/stripe',
+ this.controller.createStripeProduct.bind(this.controller),
+ );
+ router.post(
+ '/stripeCreate',
+ this.controller.seedStripeProducts.bind(this.controller),
+ );
+
+ router.post(
+ '/remainingStripeProducts',
+ this.controller.seedRemainingStripeProducts.bind(this.controller),
+ );
+
+ router.post(
+ '/create-checkout-session-external',
+ this.controller.makePaymentMultiple.bind(this.controller),
+ );
+
+ router.post(
+ '/get-stripe-prices',
+ this.controller.getAllPricesFromStripe.bind(this.controller),
+ );
+
+ router.post(
+ '/send-email-success',
+ this.controller.sendMailToCustomer.bind(this.controller),
+ );
+
+ return router;
+ }
+}
+
+module.exports = ProductsRouter;
diff --git a/routers/usersRouter.js b/routers/usersRouter.js
new file mode 100644
index 00000000..521ec6f9
--- /dev/null
+++ b/routers/usersRouter.js
@@ -0,0 +1,22 @@
+const express = require("express");
+const router = express.Router();
+
+class UsersRouter {
+ constructor(controller) {
+ this.controller = controller;
+ }
+ routes() {
+ router.get("/", this.controller.getAll.bind(this.controller));
+ router.put("/", this.controller.getUserBasedOnEmail.bind(this.controller));
+ router.post("/", this.controller.postNewUser.bind(this.controller));
+ router.put("/:userId", this.controller.updateUser.bind(this.controller));
+ router.delete("/:userId", this.controller.deleteOne.bind(this.controller));
+ router.get(
+ "/stripe-customer",
+ this.controller.getStripeCustomerDetails.bind(this.controller)
+ );
+ return router;
+ }
+}
+
+module.exports = UsersRouter;