From 40aa39585acb47f8006b020b7af9739fa4ab7b4b Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 12:33:26 +0300 Subject: [PATCH 01/79] allow for RON currency --- config/settingsSchema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/settingsSchema.json b/config/settingsSchema.json index 0c01ae8c..5a1ce599 100644 --- a/config/settingsSchema.json +++ b/config/settingsSchema.json @@ -65,7 +65,7 @@ }, "currencyISO": { "type": "string", - "enum": ["USD", "EUR", "GBP"], + "enum": ["USD", "EUR", "GBP", "RON"], "default": "USD" }, "paymentGateway": { From b861a482133e80d877c77d5114681bf5384c1575 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 12:45:53 +0300 Subject: [PATCH 02/79] added romanian as language option. Translation of everything will follow next week --- locales/en.json | 3 +- locales/it.json | 3 +- locales/ro.json | 230 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 234 insertions(+), 2 deletions(-) create mode 100644 locales/ro.json diff --git a/locales/en.json b/locales/en.json index 55651174..8f5f704c 100644 --- a/locales/en.json +++ b/locales/en.json @@ -2,6 +2,7 @@ "Languages": "Languages", "en": "English", "it": "Italiano", + "ro": "Romanian", "Cart": "Cart", "Name": "Name", "New": "New", @@ -226,4 +227,4 @@ "The Serial number, GTIN or Barcode": "The Serial number, GTIN or Barcode", "Product Brand": "Product Brand", "The brand of the product": "The brand of the product" -} \ No newline at end of file +} diff --git a/locales/it.json b/locales/it.json index 58b5ab25..7dbf83bd 100644 --- a/locales/it.json +++ b/locales/it.json @@ -2,6 +2,7 @@ "Languages": "Lingue", "en": "English", "it": "Italiano", + "ro": "Romanian", "Cart": "Carrello", "Name": "Nome", "New": "Nuovo", @@ -185,4 +186,4 @@ "Password": "Password", "Create Order": "Create Order", "Create order": "Create order" -} \ No newline at end of file +} diff --git a/locales/ro.json b/locales/ro.json new file mode 100644 index 00000000..b1af8f09 --- /dev/null +++ b/locales/ro.json @@ -0,0 +1,230 @@ +{ + "Languages": "Languages", + "en": "Engleză", + "it": "Italiană", + "ro": "Română", + "Cart": "Cart", + "Name": "Name", + "New": "New", + "Settings": "Settings", + "General settings": "General settings", + "Address 1": "Address 1", + "Address 2": "Address 2", + "Country": "Country", + "State": "State", + "Postcode": "Postcode", + "Phone number": "Phone number", + "Creation date": "Creation date", + "Customers can be filtered by: email, name or phone number": "Customers can be filtered by: email, name or phone number", + "Customers": "Customers", + "Filtered term": "Filtered term", + "No orders found": "No orders found", + "Email address": "Email address", + "Please enter your email address": "Please enter your email address", + "Reset": "Reset", + "Please sign in": "Please sign in", + "Sign in": "Sign in", + "Update status": "Update status", + "Go Back": "Go Back", + "Order date": "Order date", + "Order ID": "Order ID", + "Payment Gateway ref": "Payment Gateway ref", + "Payment Gateway": "Payment Gateway", + "Order total amount": "Order total amount", + "First name": "First name", + "Last name": "Last name", + "Order comment": "Order comment", + "Products ordered": "Products ordered", + "Options": "Options", + "Filter": "Filter", + "By status": "By status", + "Orders can be filtered by: surname, email address or postcode/zipcode": "Orders can be filtered by: surname, email address or postcode/zipcode", + "Completed": "Completed", + "Paid": "Paid", + "Created": "Created", + "Cancelled": "Cancelled", + "Declined": "Declined", + "Shipped": "Shipped", + "Pending": "Pending", + "Orders": "Orders", + "Recent orders": "Recent orders", + "Status": "Status", + "Upload image": "Upload image", + "Save product": "Save product", + "Edit product": "Edit product", + "Product title": "Product title", + "Product price": "Product price", + "Published": "Published", + "Draft": "Draft", + "Stock level": "Stock level", + "Product description": "Product description", + "Validate": "Validate", + "This sets a readable URL for the product": "This sets a readable URL for the product", + "Product options": "Product options", + "Label": "Label", + "Type": "Type", + "Add": "Add", + "Remove": "Remove", + "Here you can set options for your product. Eg: Size, color, style": "Here you can set options for your product. Eg: Size, color, style", + "Allow comment": "Allow comment", + "Allow free form comments when adding products to cart": "Allow free form comments when adding products to cart", + "Product tag words": "Product tag words", + "Tag words used to indexed products, making them easier to find and filter.": "Tag words used to indexed products, making them easier to find and filter.", + "Product images": "Product images", + "Delete": "Delete", + "main image": "main image", + "Set as main image": "Set as main image", + "No images have been uploaded for this product": "No images have been uploaded for this product", + "Product image upload": "Product image upload", + "Select file": "Select file", + "Upload": "Upload", + "New product": "New product", + "Products can be filtered by: product title or product description keywords": "Products can be filtered by: product title or product description keywords", + "Products": "Products", + "Recent products": "Recent products", + "Confirm": "Confirm", + "Update": "Update", + "Setting_menu_explain": "Here you can setup a menu to displayed on your shopping cart. You can use this menu to filter your products by specifying a keyword in the \"link\" field. Eg: To show products with a keyword (or tag) of boots you would set the menu field to \"Backpacks\" and a link value \"backpack\". You can also use this menu to link to static pages, Eg: shipping, returns, help, about, contact etc.", + "Static page": "Static page", + "Page name": "Page name", + "A friendly name to manage the static page.": "A friendly name to manage the static page.", + "Page slug": "Page slug", + "Page_Slug_Description": "This is the relative URL of the page. Eg: A setting of \"about\" would make the page available at: mydomain.com/about", + "Page Enabled": "Page Enabled", + "Page content": "Page content", + "Here you can enter the content you wish to be displayed on your static page.": "Here you can enter the content you wish to be displayed on your static page.", + "New page": "New page", + "Static pages": "Static pages", + "Static_Pages_Info": "Here you can setup and manage static pages for your shopping cart. You may want to setup a page with a little bit about your business called \"About\" or \"Contact Us\" etc.", + "Edit": "Edit", + "There are currently no static pages setup. Please setup a static page.": "There are currently no static pages setup. Please setup a static page.", + "Create new": "Create new", + "Search": "Search", + "Cart name": "Cart name", + "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.", + "Cart description": "Cart description", + "This description shows when your website is listed in search engine results.": "This description shows when your website is listed in search engine results.", + "Cart image/logo": "Cart image/logo", + "Cart URL": "Cart URL", + "This URL is used in sitemaps and when your customer returns from completing their payment.": "This URL is used in sitemaps and when your customer returns from completing their payment.", + "This is used as the \"from\" email when sending receipts to your customers.": "This is used as the \"from\" email when sending receipts to your customers.", + "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.", + "Payment gateway": "Payment gateway", + "Payment_Gateway_Info": "You will also need to configure your payment gateway credentials in the `/config/.json` file.", + "Currency symbol": "Currency symbol", + "Set this to your currency symbol. Eg: $, £, €": "Set this to your currency symbol. Eg: $, £, €", + "Theme": "Theme", + "Theme_Info": "Themes are loaded from `/public/themes/`", + "Products per row": "Products per row", + "The number of products to be displayed across the page.": "The number of products to be displayed across the page.", + "Products per page": "Products per page", + "The number of products to be displayed on each page.": "The number of products to be displayed on each page.", + "Menu Enabled": "Menu Enabled", + "Menu_Enabled_Info": "If a menu is set you can set it up here.", + "Menu header": "Menu header", + "The heading text for your menu.": "The heading text for your menu.", + "Menu location": "Menu location", + "The location of your menu.": "The location of your menu.", + "Google_Analytics_Info": "Your Google Analytics code. Please also inlude the \"script\" tags - Help", + "Custom CSS": "Custom CSS", + "Send test email": "Send test email", + "Users name": "Users name", + "User email": "User email", + "Password confirm": "Password confirm", + "User password": "User password", + "Complete setup": "Complete setup", + "User is admin?": "User is admin?", + "Generate": "Generate", + "New User": "New User", + "Create": "Create", + "Role": "Role", + "User": "User", + "No products found": "No products found", + "Category": "Category", + "Search results": "Search results", + "Add to cart": "Add to cart", + "Pay now": "Pay now", + "Customer details": "Customer details", + "Existing customer": "Existing customer", + "Forgotten": "Forgotten", + "Change customer": "Change customer", + "Enter a password to create an account for next time": "Enter a password to create an account for next time", + "Create account": "Create account", + "Your payment has been successfully processed": "Your payment has been successfully processed", + "Your payment has failed. Please try again or contact us.": "Your payment has failed. Please try again or contact us.", + "Please retain the details above as a reference of payment.": "Please retain the details above as a reference of payment.", + "Quantity": "Quantity", + "Leave a comment?": "Leave a comment?", + "Cart contents": "Cart contents", + "Shipping": "Shipping:", + "Empty cart": "Empty cart", + "List": "List", + "Order type": "Order type", + "New user": "New user", + "Payment ID": "Payment ID", + "Payment Message": "Payment Message", + "Password": "Password", + "Cart Email": "Cart Email", + "Information": "Information", + "Shipping options": "Shipping options", + "Proceed to payment": "Proceed to payment", + "Return to information": "Return to information", + "Search shop": "Search shop", + "Dashboard": "Dashboard", + "Create order": "Create order", + "Order shipping amount": "Order shipping amount", + "Order net amount": "Order net amount", + "Discount code": "Discount code", + "Apply": "Apply", + "Discount codes": "Discount codes", + "Code": "Code", + "Expiry": "Expiry", + "There are currently no discount codes setup.": "There are currently no discount codes setup.", + "New discount": "New discount", + "Amount": "Amount", + "Percent": "Percent", + "Discount type": "Discount type", + "Discount value": "Discount value", + "Discount": "Discount", + "Edit discount": "Edit discount", + "New Discount": "New Discount", + "Discount start": "Discount start", + "Discount end": "Discount end", + "Start": "Start", + "Running": "Running", + "Not running": "Not running", + "Menu": "Menu", + "Users": "Users", + "Create Order": "Create Order", + "User edit": "User edit", + "Blockonomics payment details": "Blockonomics payment details", + "Order Expected BTC": "Order Expected BTC", + "Order Received BTC": "Order Received BTC", + "Order Blockonomics Txid": "Order Blockonomics Txid", + "Currency ISO": "Currency ISO", + "Currency used for Blockonomics conversion": "Currency used for Blockonomics conversion", + "Logout": "Logout", + "Company": "Company", + "View": "View", + "Related products": "Related products", + "Disable stock tracking": "Disable stock tracking", + "Company name": "Company name", + "Product variants": "Product variants", + "Shown in the variant dropdown": "Shown in the variant dropdown", + "Here you can set variants for your product. Eg: Size, color, style": "Here you can set variants for your product. Eg: Size, color, style", + "Product Order By": "Product Order By", + "Date": "Date", + "Title": "Title", + "Select the field by which the product should be sorted when displayed in store.": "Select the field by which the product should be sorted when displayed in store.", + "Product Order": "Product Order", + "Descending": "Descending", + "Ascending": "Ascending", + "Select the order in which the products should be sorted.": "Select the order in which the products should be sorted.", + "Recent reviews": "Recent reviews", + "Reviews can be filtered by: review title or review description keywords": "Reviews can be filtered by: review title or review description keywords", + "Reviews": "Reviews", + "Product GTIN": "Product GTIN", + "The Serial number, GTIN or Barcode": "The Serial number, GTIN or Barcode", + "Product Brand": "Product Brand", + "The brand of the product": "The brand of the product" +} From 5a880a24294cdf7f278130e5a56ff6a6d2975944 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 12:47:15 +0300 Subject: [PATCH 03/79] added romanian as language option. Translation of everything will follow next week --- package-lock.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 4b415336..1383bf49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6943,7 +6943,8 @@ "version": "4.34.9", "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.34.9.tgz", "integrity": "sha512-jvc4DlJeXazsen2riPDR97GSaHNCmoL+mgfB8IXxmpNpNd7kv5MfkuihXEmF1/prBFtqzUA2lxnt1qp4maOMQA==", - "dev": true + "dev": true, + "optional": true }, "table": { "version": "5.4.6", From 9ba41d868ac06b2fe4d9aca1cb89535c2cc378e5 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 13:08:09 +0300 Subject: [PATCH 04/79] themes are loaded from views not public --- locales/en.json | 4 ++-- locales/it.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/en.json b/locales/en.json index 55651174..956d568b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -113,7 +113,7 @@ "Currency symbol": "Currency symbol", "Set this to your currency symbol. Eg: $, £, €": "Set this to your currency symbol. Eg: $, £, €", "Theme": "Theme", - "Theme_Info": "Themes are loaded from `/public/themes/`", + "Theme_Info": "Themes are loaded from `/views/themes/`", "Products per row": "Products per row", "The number of products to be displayed across the page.": "The number of products to be displayed across the page.", "Products per page": "Products per page", @@ -226,4 +226,4 @@ "The Serial number, GTIN or Barcode": "The Serial number, GTIN or Barcode", "Product Brand": "Product Brand", "The brand of the product": "The brand of the product" -} \ No newline at end of file +} diff --git a/locales/it.json b/locales/it.json index 58b5ab25..fa129cef 100644 --- a/locales/it.json +++ b/locales/it.json @@ -115,7 +115,7 @@ "Currency symbol": "Simbolo valuta", "Set this to your currency symbol. Eg: $, £, €": "Configura il simbolo della tua valuta. Es: $, £, €", "Theme": "Tema", - "Theme_Info": "I temi sono caricati da `/public/themes/`", + "Theme_Info": "I temi sono caricati da `/views/themes/`", "Products per row": "Prodotti per riga", "The number of products to be displayed across the page.": "Il numero di prodotti visualizzati per riga nella pagina", "Products per page": "Prodotti per pagina", @@ -185,4 +185,4 @@ "Password": "Password", "Create Order": "Create Order", "Create order": "Create order" -} \ No newline at end of file +} From d725bd147893cb261dba78b05b3cd2de5fd0bcf3 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 15:10:56 +0300 Subject: [PATCH 05/79] Add wiretransfer and payment on delivery as payment options --- app.js | 2 +- config/payment/config/ondelivery.json | 6 ++ config/payment/config/wiretransfer.json | 6 ++ config/payment/schema/ondelivery.json | 24 +++++++ config/payment/schema/wiretransfer.json | 24 +++++++ lib/payments/ondelivery.js | 85 +++++++++++++++++++++++ lib/payments/wiretransfer.js | 88 ++++++++++++++++++++++++ public/javascripts/common.js | 22 ++++++ views/partials/payments/ondelivery.hbs | 4 ++ views/partials/payments/wiretransfer.hbs | 4 ++ views/themes/Cloth/payment-complete.hbs | 1 + 11 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 config/payment/config/ondelivery.json create mode 100644 config/payment/config/wiretransfer.json create mode 100644 config/payment/schema/ondelivery.json create mode 100644 config/payment/schema/wiretransfer.json create mode 100644 lib/payments/ondelivery.js create mode 100644 lib/payments/wiretransfer.js create mode 100644 views/partials/payments/ondelivery.hbs create mode 100644 views/partials/payments/wiretransfer.hbs diff --git a/app.js b/app.js index 9b475af8..c369d7f6 100644 --- a/app.js +++ b/app.js @@ -250,7 +250,7 @@ handlebars = handlebars.create({ } if(status === 'Pending'){ const paymentConfig = getPaymentConfig(); - if(config.paymentGateway === 'instore'){ + if(['instore', 'wiretransfer' , 'ondelivery'].includes(config.paymentGateway) ){ return `

${paymentConfig.resultMessage}

`; } return '

The payment for this order is pending. We will be in contact shortly.

'; diff --git a/config/payment/config/ondelivery.json b/config/payment/config/ondelivery.json new file mode 100644 index 00000000..1d34011a --- /dev/null +++ b/config/payment/config/ondelivery.json @@ -0,0 +1,6 @@ +{ + "description": "Pay on Delivery", + "orderStatus": "Pending", + "buttonText": "You will pay on delivery", + "resultMessage": "The order is place. Please pay for your order on delivery." +} diff --git a/config/payment/config/wiretransfer.json b/config/payment/config/wiretransfer.json new file mode 100644 index 00000000..440fbdd1 --- /dev/null +++ b/config/payment/config/wiretransfer.json @@ -0,0 +1,6 @@ +{ + "description": "Pay with wire transfer", + "orderStatus": "Pending", + "buttonText": "You will pay with wire transfer", + "resultMessage": "The order is place. Please pay for your order with wiretransfer." +} diff --git a/config/payment/schema/ondelivery.json b/config/payment/schema/ondelivery.json new file mode 100644 index 00000000..57df1be6 --- /dev/null +++ b/config/payment/schema/ondelivery.json @@ -0,0 +1,24 @@ +{ + "properties": { + "description": { + "type": "string" + }, + "orderStatus": { + "type": "string", + "enum": ["Completed", "Paid", "Pending"] + }, + "buttonText": { + "type": "string" + }, + "resultMessage": { + "type": "string" + } + }, + "required": [ + "description", + "orderStatus", + "buttonText", + "resultMessage" + ], + "additionalProperties": false +} diff --git a/config/payment/schema/wiretransfer.json b/config/payment/schema/wiretransfer.json new file mode 100644 index 00000000..57df1be6 --- /dev/null +++ b/config/payment/schema/wiretransfer.json @@ -0,0 +1,24 @@ +{ + "properties": { + "description": { + "type": "string" + }, + "orderStatus": { + "type": "string", + "enum": ["Completed", "Paid", "Pending"] + }, + "buttonText": { + "type": "string" + }, + "resultMessage": { + "type": "string" + } + }, + "required": [ + "description", + "orderStatus", + "buttonText", + "resultMessage" + ], + "additionalProperties": false +} diff --git a/lib/payments/ondelivery.js b/lib/payments/ondelivery.js new file mode 100644 index 00000000..c0d84a9a --- /dev/null +++ b/lib/payments/ondelivery.js @@ -0,0 +1,85 @@ +const express = require('express'); +const { indexOrders } = require('../indexing'); +const { getId, sendEmail, getEmailTemplate } = require('../common'); +const { getPaymentConfig } = require('../config'); +const { emptyCart } = require('../cart'); +const router = express.Router(); + +// The homepage of the site +router.post('/checkout_action', async (req, res, next) => { + const db = req.app.db; + const config = req.app.config; + const paymentConfig = getPaymentConfig('ondelivery'); + + const orderDoc = { + orderPaymentId: getId(), + orderPaymentGateway: 'Ondelivery', + orderPaymentMessage: 'Your payment was successfully completed', + orderPaymentInstruction : `Please pay ${req.session.totalCartNetAmount} ${config.currencyISO} on delivery`, + orderTotal: req.session.totalCartNetAmount, + orderShipping: 0, + orderItemCount: req.session.totalCartItems, + orderProductCount: req.session.totalCartProducts, + orderCustomer: getId(req.session.customerId), + orderEmail: req.session.customerEmail, + orderCompany: req.session.customerCompany, + orderFirstname: req.session.customerFirstname, + orderLastname: req.session.customerLastname, + orderAddr1: req.session.customerAddress1, + orderAddr2: req.session.customerAddress2, + orderCountry: req.session.customerCountry, + orderState: req.session.customerState, + orderPostcode: req.session.customerPostcode, + orderPhoneNumber: req.session.customerPhone, + orderComment: req.session.orderComment, + orderStatus: paymentConfig.orderStatus, + orderDate: new Date(), + orderProducts: req.session.cart, + orderType: 'Single' + }; + + // insert order into DB + try{ + const newDoc = await db.orders.insertOne(orderDoc); + + // get the new ID + const newId = newDoc.insertedId; + + // add to lunr index + indexOrders(req.app) + .then(() => { + // set the results + req.session.messageType = 'success'; + req.session.message = 'Your order was successfully placed. Payment for your order will be completed instore.'; + req.session.paymentEmailAddr = newDoc.ops[0].orderEmail; + req.session.paymentApproved = true; + req.session.paymentDetails = `

Order ID: ${newId}

+

Transaction ID: ${orderDoc.orderPaymentId}

`; + + // set payment results for email + const paymentResults = { + message: req.session.message, + messageType: req.session.messageType, + paymentEmailAddr: req.session.paymentEmailAddr, + paymentApproved: true, + paymentDetails: req.session.paymentDetails + }; + + // clear the cart + if(req.session.cart){ + emptyCart(req, res, 'function'); + } + + // send the email with the response + // TODO: Should fix this to properly handle result + sendEmail(req.session.paymentEmailAddr, `Your order with ${config.cartTitle}`, getEmailTemplate(paymentResults)); + + // Return outcome + res.json({ paymentId: newId }); + }); + }catch(ex){ + res.status(400).json({ err: 'Your order declined. Please try again' }); + } +}); + +module.exports = router; diff --git a/lib/payments/wiretransfer.js b/lib/payments/wiretransfer.js new file mode 100644 index 00000000..b8b93ff5 --- /dev/null +++ b/lib/payments/wiretransfer.js @@ -0,0 +1,88 @@ +const express = require('express'); +const { indexOrders } = require('../indexing'); +const { getId, sendEmail, getEmailTemplate } = require('../common'); +const { getPaymentConfig } = require('../config'); +const config = require('../config'); +const { emptyCart } = require('../cart'); +const router = express.Router(); + +// The homepage of the site +router.post('/checkout_action', async (req, res, next) => { + const db = req.app.db; + const config = req.app.config; + const paymentConfig = getPaymentConfig('wiretransfer'); + + const orderDoc = { + orderPaymentId: getId(), + orderPaymentGateway: 'Wiretransfer', + orderPaymentMessage: 'Wiretransfer pending', + orderPaymentInstruction : `Please pay ${req.session.totalCartNetAmount} ${config.currencyISO} On account \"XXXXXXXXXXXXXXXX\" within 3 days.`, + orderTotal: req.session.totalCartNetAmount, + orderShipping: 0, + orderItemCount: req.session.totalCartItems, + orderProductCount: req.session.totalCartProducts, + orderCustomer: getId(req.session.customerId), + orderEmail: req.session.customerEmail, + orderCompany: req.session.customerCompany, + orderFirstname: req.session.customerFirstname, + orderLastname: req.session.customerLastname, + orderAddr1: req.session.customerAddress1, + orderAddr2: req.session.customerAddress2, + orderCountry: req.session.customerCountry, + orderState: req.session.customerState, + orderPostcode: req.session.customerPostcode, + orderPhoneNumber: req.session.customerPhone, + orderComment: req.session.orderComment, + orderStatus: paymentConfig.orderStatus, + orderDate: new Date(), + orderProducts: req.session.cart, + orderType: 'Single' + }; + + // insert order into DB + try{ + const newDoc = await db.orders.insertOne(orderDoc); + + // get the new ID + const newId = newDoc.insertedId; + + // add to lunr index + indexOrders(req.app) + .then(() => { + // set the results + req.session.messageType = 'success'; + req.session.message = 'Your order was successfully placed. Payment for your order will be done with wire transfer'; + req.session.paymentEmailAddr = newDoc.ops[0].orderEmail; + req.session.paymentApproved = true; + req.session.paymentDetails = `

Order ID: ${newId}

+

Transaction ID: ${orderDoc.orderPaymentId}

; +

Please pay {orderDoc.orderTotal} On account "XXXXXXXXXXXXXXXX" within 3 days.

; +

Transaction ID: ${orderDoc.orderPaymentId}

`; + + // set payment results for email + const paymentResults = { + message: req.session.message, + messageType: req.session.messageType, + paymentEmailAddr: req.session.paymentEmailAddr, + paymentApproved: true, + paymentDetails: req.session.paymentDetails + }; + + // clear the cart + if(req.session.cart){ + emptyCart(req, res, 'function'); + } + + // send the email with the response + // TODO: Should fix this to properly handle result + sendEmail(req.session.paymentEmailAddr, `Your order with ${config.cartTitle}`, getEmailTemplate(paymentResults)); + + // Return outcome + res.json({ paymentId: newId }); + }); + }catch(ex){ + res.status(400).json({ err: 'Your order declined. Please try again' }); + } +}); + +module.exports = router; diff --git a/public/javascripts/common.js b/public/javascripts/common.js index 2261f8fe..29ea07a3 100644 --- a/public/javascripts/common.js +++ b/public/javascripts/common.js @@ -62,6 +62,28 @@ $(document).ready(function (){ window.location = '/payment/' + response.paymentId; }); }); + $('#checkoutWiretransfer').validator().on('click', function(e){ + e.preventDefault(); + $.ajax({ + type: 'POST', + url: '/wiretransfer/checkout_action' + }).done((response) => { + window.location = '/payment/' + response.paymentId; + }).fail((response) => { + window.location = '/payment/' + response.paymentId; + }); + }); + $('#checkoutOnDelivery').validator().on('click', function(e){ + e.preventDefault(); + $.ajax({ + type: 'POST', + url: '/ondelivery/checkout_action' + }).done((response) => { + window.location = '/payment/' + response.paymentId; + }).fail((response) => { + window.location = '/payment/' + response.paymentId; + }); + }); if($('#adyen-dropin').length > 0){ $.ajax({ diff --git a/views/partials/payments/ondelivery.hbs b/views/partials/payments/ondelivery.hbs new file mode 100644 index 00000000..c3fa27fc --- /dev/null +++ b/views/partials/payments/ondelivery.hbs @@ -0,0 +1,4 @@ +
+
{{@root.paymentConfig.ondelivery.description}}
+ +
diff --git a/views/partials/payments/wiretransfer.hbs b/views/partials/payments/wiretransfer.hbs new file mode 100644 index 00000000..c64ad431 --- /dev/null +++ b/views/partials/payments/wiretransfer.hbs @@ -0,0 +1,4 @@ +
+
{{@root.paymentConfig.wiretransfer.description}}
+ +
diff --git a/views/themes/Cloth/payment-complete.hbs b/views/themes/Cloth/payment-complete.hbs index 061215e5..085ccb76 100644 --- a/views/themes/Cloth/payment-complete.hbs +++ b/views/themes/Cloth/payment-complete.hbs @@ -5,6 +5,7 @@

{{ @root.__ "Order ID" }}: {{result._id}}

{{ @root.__ "Payment ID" }}: {{result.orderPaymentId}}

+ {{#if result.orderPaymentInstruction}}

{{ @root.__ "Payment Instruction" }}: {{result.orderPaymentInstruction}}

{{/if}}
{{#paymentOutcome result.orderStatus}}{{/paymentOutcome}} Home From ed9b5249cfe889c4c07f06b04ec8ad56b679a098 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 15:17:32 +0300 Subject: [PATCH 06/79] added account number to the wiretransfer config --- config/payment/config/wiretransfer.json | 3 ++- config/payment/schema/wiretransfer.json | 6 +++++- lib/payments/wiretransfer.js | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/config/payment/config/wiretransfer.json b/config/payment/config/wiretransfer.json index 440fbdd1..f0895626 100644 --- a/config/payment/config/wiretransfer.json +++ b/config/payment/config/wiretransfer.json @@ -2,5 +2,6 @@ "description": "Pay with wire transfer", "orderStatus": "Pending", "buttonText": "You will pay with wire transfer", - "resultMessage": "The order is place. Please pay for your order with wiretransfer." + "resultMessage": "The order is place. Please pay for your order with wiretransfer.", + "accountNumber" : "XXXXXXXXX-XXXXXX-X" } diff --git a/config/payment/schema/wiretransfer.json b/config/payment/schema/wiretransfer.json index 57df1be6..9f97ae84 100644 --- a/config/payment/schema/wiretransfer.json +++ b/config/payment/schema/wiretransfer.json @@ -12,13 +12,17 @@ }, "resultMessage": { "type": "string" + }, + "accountNumber": { + "type": "string" } }, "required": [ "description", "orderStatus", "buttonText", - "resultMessage" + "resultMessage", + "accountNumber" ], "additionalProperties": false } diff --git a/lib/payments/wiretransfer.js b/lib/payments/wiretransfer.js index b8b93ff5..94983877 100644 --- a/lib/payments/wiretransfer.js +++ b/lib/payments/wiretransfer.js @@ -16,7 +16,7 @@ router.post('/checkout_action', async (req, res, next) => { orderPaymentId: getId(), orderPaymentGateway: 'Wiretransfer', orderPaymentMessage: 'Wiretransfer pending', - orderPaymentInstruction : `Please pay ${req.session.totalCartNetAmount} ${config.currencyISO} On account \"XXXXXXXXXXXXXXXX\" within 3 days.`, + orderPaymentInstruction : `Please pay ${req.session.totalCartNetAmount} ${config.currencyISO} On account ${paymentConfig.accountNumber} within 3 days.`, orderTotal: req.session.totalCartNetAmount, orderShipping: 0, orderItemCount: req.session.totalCartItems, From 78fad9ca46872d9ed2109c59a2ec68fed3051543 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 15:36:16 +0300 Subject: [PATCH 07/79] make search fuzzy by 1 edit, for convenience for the end user --- routes/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/index.js b/routes/index.js index 84aa3ae2..920194d3 100644 --- a/routes/index.js +++ b/routes/index.js @@ -926,7 +926,7 @@ router.get('/search/:searchTerm/:pageNum?', (req, res) => { const numberProducts = config.productsPerPage ? config.productsPerPage : 6; const lunrIdArray = []; - productsIndex.search(searchTerm).forEach((id) => { + productsIndex.search(`${searchTerm}~1`).forEach((id) => { lunrIdArray.push(getId(id.ref)); }); From 647ef4075aed2cf022d61c324f5e3eb9c5c933b2 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 15:36:16 +0300 Subject: [PATCH 08/79] make search fuzzy by 1 edit, for convenience for the end user Signed-off-by: nick --- routes/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/index.js b/routes/index.js index 84aa3ae2..920194d3 100644 --- a/routes/index.js +++ b/routes/index.js @@ -926,7 +926,7 @@ router.get('/search/:searchTerm/:pageNum?', (req, res) => { const numberProducts = config.productsPerPage ? config.productsPerPage : 6; const lunrIdArray = []; - productsIndex.search(searchTerm).forEach((id) => { + productsIndex.search(`${searchTerm}~1`).forEach((id) => { lunrIdArray.push(getId(id.ref)); }); From 5a1c28a457609e2c5634e3285be08880452c8c3f Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 16:24:41 +0300 Subject: [PATCH 09/79] save order currency in DB. --- lib/payments/ondelivery.js | 1 + lib/payments/paypal.js | 1 + lib/payments/stripe.js | 2 ++ lib/payments/wiretransfer.js | 1 + lib/payments/zip.js | 1 + routes/order.js | 1 + 6 files changed, 7 insertions(+) diff --git a/lib/payments/ondelivery.js b/lib/payments/ondelivery.js index c0d84a9a..6f45f7d1 100644 --- a/lib/payments/ondelivery.js +++ b/lib/payments/ondelivery.js @@ -17,6 +17,7 @@ router.post('/checkout_action', async (req, res, next) => { orderPaymentMessage: 'Your payment was successfully completed', orderPaymentInstruction : `Please pay ${req.session.totalCartNetAmount} ${config.currencyISO} on delivery`, orderTotal: req.session.totalCartNetAmount, + orderCurrency: config.currencyISO, orderShipping: 0, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, diff --git a/lib/payments/paypal.js b/lib/payments/paypal.js index c06611d1..3266602e 100644 --- a/lib/payments/paypal.js +++ b/lib/payments/paypal.js @@ -165,6 +165,7 @@ router.post('/checkout_action', (req, res, next) => { orderPaymentId: payment.id, orderPaymentGateway: 'Paypal', orderTotal: req.session.totalCartAmount, + orderCurrency: config.currencyISO, orderShipping: req.session.totalCartShipping, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, diff --git a/lib/payments/stripe.js b/lib/payments/stripe.js index 851ea4c7..0eef36c1 100644 --- a/lib/payments/stripe.js +++ b/lib/payments/stripe.js @@ -54,6 +54,7 @@ router.post('/checkout_action', async (req, res, next) => { orderPaymentGateway: 'Stripe', orderPaymentMessage: charge.outcome.seller_message, orderTotal: req.session.totalCartAmount, + orderCurrency: config.currencyISO, orderShipping: req.session.totalCartShipping, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, @@ -235,6 +236,7 @@ router.post('/checkout_action_subscription', async (req, res, next) => { orderPaymentGateway: 'Stripe', orderPaymentMessage: subscription.collection_method, orderTotal: req.session.totalCartAmount, + orderCurrency: config.currencyISO, orderShipping: req.session.totalCartShipping, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, diff --git a/lib/payments/wiretransfer.js b/lib/payments/wiretransfer.js index 94983877..986b19e4 100644 --- a/lib/payments/wiretransfer.js +++ b/lib/payments/wiretransfer.js @@ -18,6 +18,7 @@ router.post('/checkout_action', async (req, res, next) => { orderPaymentMessage: 'Wiretransfer pending', orderPaymentInstruction : `Please pay ${req.session.totalCartNetAmount} ${config.currencyISO} On account ${paymentConfig.accountNumber} within 3 days.`, orderTotal: req.session.totalCartNetAmount, + orderCurrency: config.currencyISO, orderShipping: 0, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, diff --git a/lib/payments/zip.js b/lib/payments/zip.js index 364db870..019101ad 100644 --- a/lib/payments/zip.js +++ b/lib/payments/zip.js @@ -116,6 +116,7 @@ router.post('/setup', async (req, res, next) => { orderPaymentId: response.data.id, orderPaymentGateway: 'Zip', orderTotal: req.session.totalCartAmount, + orderCurrency: config.currencyISO, orderShipping: req.session.totalCartShipping, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, diff --git a/routes/order.js b/routes/order.js index da7dd74e..cf1300db 100644 --- a/routes/order.js +++ b/routes/order.js @@ -134,6 +134,7 @@ router.post('/admin/order/create', async (req, res, next) => { orderPaymentGateway: 'Instore', orderPaymentMessage: 'Your payment was successfully completed', orderTotal: req.session.totalCartAmount, + orderCurrency: config.currencyISO, orderShipping: req.session.totalCartShipping, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, From 8b9a4cdc101f8126607cd1022ea208129e0eaeae Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 16:28:36 +0300 Subject: [PATCH 10/79] there are shipping costs when using wiretransfer or pay on delivery --- lib/payments/ondelivery.js | 4 ++-- lib/payments/wiretransfer.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/payments/ondelivery.js b/lib/payments/ondelivery.js index c0d84a9a..38af6b6d 100644 --- a/lib/payments/ondelivery.js +++ b/lib/payments/ondelivery.js @@ -16,8 +16,8 @@ router.post('/checkout_action', async (req, res, next) => { orderPaymentGateway: 'Ondelivery', orderPaymentMessage: 'Your payment was successfully completed', orderPaymentInstruction : `Please pay ${req.session.totalCartNetAmount} ${config.currencyISO} on delivery`, - orderTotal: req.session.totalCartNetAmount, - orderShipping: 0, + orderTotal: req.session.totalCartAmount, + orderShipping: req.session.totalCartShipping, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, orderCustomer: getId(req.session.customerId), diff --git a/lib/payments/wiretransfer.js b/lib/payments/wiretransfer.js index 94983877..1b3cd26a 100644 --- a/lib/payments/wiretransfer.js +++ b/lib/payments/wiretransfer.js @@ -17,8 +17,8 @@ router.post('/checkout_action', async (req, res, next) => { orderPaymentGateway: 'Wiretransfer', orderPaymentMessage: 'Wiretransfer pending', orderPaymentInstruction : `Please pay ${req.session.totalCartNetAmount} ${config.currencyISO} On account ${paymentConfig.accountNumber} within 3 days.`, - orderTotal: req.session.totalCartNetAmount, - orderShipping: 0, + orderTotal: req.session.totalCartAmount, + orderShipping: req.session.totalCartShipping, orderItemCount: req.session.totalCartItems, orderProductCount: req.session.totalCartProducts, orderCustomer: getId(req.session.customerId), From 1e059929fa383375f97fbe3ea26fc5958e611fb2 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 17:38:10 +0300 Subject: [PATCH 11/79] add RO translations --- locales/ro.json | 420 ++++++++++++++++++++++++------------------------ 1 file changed, 210 insertions(+), 210 deletions(-) diff --git a/locales/ro.json b/locales/ro.json index b1af8f09..8afba403 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -3,228 +3,228 @@ "en": "Engleză", "it": "Italiană", "ro": "Română", - "Cart": "Cart", - "Name": "Name", - "New": "New", - "Settings": "Settings", - "General settings": "General settings", - "Address 1": "Address 1", - "Address 2": "Address 2", - "Country": "Country", - "State": "State", - "Postcode": "Postcode", - "Phone number": "Phone number", - "Creation date": "Creation date", - "Customers can be filtered by: email, name or phone number": "Customers can be filtered by: email, name or phone number", - "Customers": "Customers", - "Filtered term": "Filtered term", - "No orders found": "No orders found", - "Email address": "Email address", - "Please enter your email address": "Please enter your email address", + "Cart": "Coș", + "Name": "Nume", + "New": "Nou", + "Settings": "Setări", + "General settings": "Setări generale", + "Address 1": "Adresa 1", + "Address 2": "Adresa 2", + "Country": "Țară", + "State": "Județ", + "Postcode": "Cod poștal", + "Phone number": "Număr de telefon", + "Creation date": "Data creației", + "Customers can be filtered by: email, name or phone number": "Clienții pot fi filtrați după: e-mail, nume sau număr de telefon", + "Customers": "Clienți", + "Filtered term": "Termen filtrat", + "No orders found": "Nu s-au găsit comenzi", + "Email address": "Adresa de e-mail", + "Please enter your email address": "Vă rugăm să introduceți adresa de e-mail", "Reset": "Reset", - "Please sign in": "Please sign in", - "Sign in": "Sign in", - "Update status": "Update status", - "Go Back": "Go Back", - "Order date": "Order date", - "Order ID": "Order ID", + "Please sign in": "Vă rugăm să vă conectați", + "Sign in": "Conectați-vă", + "Update status": "Actualizați starea", + "Go Back": "Du-te înapoi", + "Order date": "Data comenzii", + "Order ID": "ID-ul comenzii", "Payment Gateway ref": "Payment Gateway ref", "Payment Gateway": "Payment Gateway", - "Order total amount": "Order total amount", - "First name": "First name", - "Last name": "Last name", - "Order comment": "Order comment", - "Products ordered": "Products ordered", - "Options": "Options", + "Order total amount": "Suma totală a comenzii", + "First name": "Prenume", + "Last name": "Numele de familie", + "Order comment": "Comandă comentariu", + "Products ordered": "Produse comandate", + "Options": "Opțiuni", "Filter": "Filter", - "By status": "By status", - "Orders can be filtered by: surname, email address or postcode/zipcode": "Orders can be filtered by: surname, email address or postcode/zipcode", - "Completed": "Completed", - "Paid": "Paid", - "Created": "Created", - "Cancelled": "Cancelled", - "Declined": "Declined", - "Shipped": "Shipped", - "Pending": "Pending", - "Orders": "Orders", - "Recent orders": "Recent orders", + "By status": "După statut", + "Orders can be filtered by: surname, email address or postcode/zipcode": "Comenzile pot fi filtrate după: prenume, adresă de e-mail sau cod poștal / cod poștal", + "Completed": "Finalizat", + "Paid": "Plătit", + "Created": "Creat", + "Cancelled": "Anulat", + "Declined": "Declinat", + "Shipped": "Expediat", + "Pending": "În așteptare", + "Orders": "Comenzi", + "Recent orders": "Comenzi recente", "Status": "Status", - "Upload image": "Upload image", - "Save product": "Save product", - "Edit product": "Edit product", - "Product title": "Product title", - "Product price": "Product price", - "Published": "Published", - "Draft": "Draft", - "Stock level": "Stock level", - "Product description": "Product description", - "Validate": "Validate", - "This sets a readable URL for the product": "This sets a readable URL for the product", - "Product options": "Product options", + "Upload image": "Încarcă imaginea", + "Save product": "Salvați produsul", + "Edit product": "Editați produsul", + "Product title": "Titlul produsului", + "Product price": "Preț produs", + "Published": "Publicat", + "Draft": "Proiect", + "Stock level": "Nivel stoc", + "Product description": "Descrierea produsului", + "Validate": "Validați", + "This sets a readable URL for the product": "Aceasta setează o adresă URL lizibilă pentru produs", + "Product options": "Opțiuni produs", "Label": "Label", "Type": "Type", - "Add": "Add", - "Remove": "Remove", - "Here you can set options for your product. Eg: Size, color, style": "Here you can set options for your product. Eg: Size, color, style", - "Allow comment": "Allow comment", - "Allow free form comments when adding products to cart": "Allow free form comments when adding products to cart", - "Product tag words": "Product tag words", - "Tag words used to indexed products, making them easier to find and filter.": "Tag words used to indexed products, making them easier to find and filter.", - "Product images": "Product images", - "Delete": "Delete", - "main image": "main image", - "Set as main image": "Set as main image", - "No images have been uploaded for this product": "No images have been uploaded for this product", - "Product image upload": "Product image upload", - "Select file": "Select file", - "Upload": "Upload", - "New product": "New product", - "Products can be filtered by: product title or product description keywords": "Products can be filtered by: product title or product description keywords", - "Products": "Products", - "Recent products": "Recent products", - "Confirm": "Confirm", - "Update": "Update", - "Setting_menu_explain": "Here you can setup a menu to displayed on your shopping cart. You can use this menu to filter your products by specifying a keyword in the \"link\" field. Eg: To show products with a keyword (or tag) of boots you would set the menu field to \"Backpacks\" and a link value \"backpack\". You can also use this menu to link to static pages, Eg: shipping, returns, help, about, contact etc.", - "Static page": "Static page", - "Page name": "Page name", - "A friendly name to manage the static page.": "A friendly name to manage the static page.", + "Add": "Adăugați", + "Remove": "Șterge", + "Here you can set options for your product. Eg: Size, color, style": "Aici puteți seta opțiuni pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", + "Allow comment": "Permiteți comentariul", + "Allow free form comments when adding products to cart": "Permiteți comentarii gratuite de formular atunci când adăugați produse în coș", + "Product tag words": "Cuvinte etichetă produs", + "Tag words used to indexed products, making them easier to find and filter.": "Etichetați cuvintele folosite la produsele indexate, făcându-le mai ușor de găsit și filtrat.", + "Product images": "Imagini de produs", + "Delete": "Șterge", + "main image": "imaginea principală", + "Set as main image": "Setați ca imagine principală", + "No images have been uploaded for this product": "Nu au fost încărcate imagini pentru acest produs", + "Product image upload": "Încărcare imagine produs", + "Select file": "Selectează fișierul", + "Upload": "Încărcare", + "New product": "Produs nou", + "Products can be filtered by: product title or product description keywords": "Produsele pot fi filtrate după: titlul produsului sau cuvintele cheie cu descrierea produsului", + "Products": "Produse", + "Recent products": "Produse recente", + "Confirm": "Confirmă", + "Update": "Actualizare", + "Setting_menu_explain": "ici puteți configura un meniu afișat în coșul dvs. de cumpărături. Puteți utiliza acest meniu pentru a filtra produsele dvs. specificând un cuvânt cheie în câmpul \\\" link \\ \". De exemplu: pentru a afișa produse cu un cuvânt cheie (sau etichetă) de cizme, ați seta câmpul de meniu la \\ \"Rucsacuri \\\" și o valoare a legăturii \\ \"rucsac \\\". De asemenea, puteți utiliza acest meniu pentru a vă conecta la pagini statice, de exemplu: expediere, returnări, ajutor, despre, contact etc. . \"", + "Static page": "Pagină statică", + "Page name": "Numele paginii", + "A friendly name to manage the static page.": "Un nume prietenos pentru a gestiona pagina statică.", "Page slug": "Page slug", - "Page_Slug_Description": "This is the relative URL of the page. Eg: A setting of \"about\" would make the page available at: mydomain.com/about", + "Page_Slug_Description": "TAceasta este adresa URL relativă a paginii. De exemplu: o setare de \\\" despre \\ \"ar face pagina disponibilă la: mydomain.com/about", "Page Enabled": "Page Enabled", - "Page content": "Page content", - "Here you can enter the content you wish to be displayed on your static page.": "Here you can enter the content you wish to be displayed on your static page.", - "New page": "New page", - "Static pages": "Static pages", - "Static_Pages_Info": "Here you can setup and manage static pages for your shopping cart. You may want to setup a page with a little bit about your business called \"About\" or \"Contact Us\" etc.", - "Edit": "Edit", - "There are currently no static pages setup. Please setup a static page.": "There are currently no static pages setup. Please setup a static page.", - "Create new": "Create new", - "Search": "Search", - "Cart name": "Cart name", - "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.", - "Cart description": "Cart description", - "This description shows when your website is listed in search engine results.": "This description shows when your website is listed in search engine results.", - "Cart image/logo": "Cart image/logo", - "Cart URL": "Cart URL", - "This URL is used in sitemaps and when your customer returns from completing their payment.": "This URL is used in sitemaps and when your customer returns from completing their payment.", - "This is used as the \"from\" email when sending receipts to your customers.": "This is used as the \"from\" email when sending receipts to your customers.", - "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.", - "Payment gateway": "Payment gateway", - "Payment_Gateway_Info": "You will also need to configure your payment gateway credentials in the `/config/.json` file.", - "Currency symbol": "Currency symbol", - "Set this to your currency symbol. Eg: $, £, €": "Set this to your currency symbol. Eg: $, £, €", - "Theme": "Theme", - "Theme_Info": "Themes are loaded from `/public/themes/`", - "Products per row": "Products per row", - "The number of products to be displayed across the page.": "The number of products to be displayed across the page.", - "Products per page": "Products per page", - "The number of products to be displayed on each page.": "The number of products to be displayed on each page.", + "Page content": "Conținutul paginii", + "Here you can enter the content you wish to be displayed on your static page.": "Aici puteți introduce conținutul pe care doriți să îl afișați pe pagina dvs. statică.", + "New page": "Pagină nouă", + "Static pages": "Pagini statice", + "Static_Pages_Info": "Aici puteți configura și gestiona pagini statice pentru coșul dvs. de cumpărături. Poate doriți să configurați o pagină cu un pic despre afacerea dvs. numită \\\" Despre \\ \"sau \\\" Contactați-ne \\ \"etc.", + "Edit": "Editează", + "There are currently no static pages setup. Please setup a static page.": "În prezent nu există configurarea paginilor statice. Vă rugăm să configurați o pagină statică.", + "Create new": "Creați un nou", + "Search": "Căutare", + "Cart name": "Numele coșului", + "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "Acest element este esențial pentru optimizarea motorului de căutare. Ca rt title este afișat dacă sigla dvs. este ascunsă..", + "Cart description": "Descrierea coșului", + "This description shows when your website is listed in search engine results.": "Această descriere arată când site-ul dvs. web este listat în rezultatele motorului de căutare.", + "Cart image/logo": "Imagine coș / logo", + "Cart URL": "Adresă URL coș", + "This URL is used in sitemaps and when your customer returns from completing their payment.": "Această adresă URL este utilizată în sitemapuri și atunci când clientul dvs. se întoarce după finalizarea plății.", + "This is used as the \"from\" email when sending receipts to your customers.": "Aceasta este utilizată ca e-mail \\\" din \\ \"la trimiterea de chitanțe către clienții dvs.", + "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Comenzile peste această valoare vor însemna că livrarea va fi GRATUITă. Setați la valoare ridicată dacă vreți să încărcați întotdeauna livrare.", + "Payment gateway": "Gateway de plată", + "Payment_Gateway_Info": "De asemenea, va trebui să vă configurați acreditările gateway-ului de plată în fișierul` / config / .json`..", + "Currency symbol": "Simbol valutar", + "Set this to your currency symbol. Eg: $, £, €": "Setați acest simbol la moneda dvs. De exemplu: $, £, €", + "Theme": "Tema", + "Theme_Info": "Temele sunt încărcate din` /views/themes/`", + "Products per row": "Produse pe rând", + "The number of products to be displayed across the page.": "Numărul de produse care trebuie afișate pe toată pagina.", + "Products per page": "Produse pe pagină", + "The number of products to be displayed on each page.": "Numărul de produse care trebuie afișate pe fiecare pagină.", "Menu Enabled": "Menu Enabled", - "Menu_Enabled_Info": "If a menu is set you can set it up here.", - "Menu header": "Menu header", - "The heading text for your menu.": "The heading text for your menu.", - "Menu location": "Menu location", - "The location of your menu.": "The location of your menu.", - "Google_Analytics_Info": "Your Google Analytics code. Please also inlude the \"script\" tags - Help", - "Custom CSS": "Custom CSS", - "Send test email": "Send test email", - "Users name": "Users name", - "User email": "User email", - "Password confirm": "Password confirm", - "User password": "User password", - "Complete setup": "Complete setup", - "User is admin?": "User is admin?", - "Generate": "Generate", - "New User": "New User", + "Menu_Enabled_Info": "Dacă este setat un meniu, îl puteți configura aici .", + "Menu header": "Antet meniu", + "The heading text for your menu.": "Textul antetului pentru meniul dvs.", + "Menu location": "Locația meniu", + "The location of your menu.": "Locația meniului dvs.", + "Google_Analytics_Info": "Codul dvs. Google Analytics. Includeți și etichetele \" script \"- Ajutor ", + "Custom CSS": "CSS personalizat", + "Send test email": "Trimiteți e-mailul de testare", + "Users name": "Numele utilizatorilor", + "User email": "Email utilizator", + "Password confirm": "Confirmare parolă", + "User password": "Parola de utilizator", + "Complete setup": "Configurare completă", + "User is admin?": "Utilizatorul este administrator?", + "Generate": "Generați", + "New User": "Utilizator nou", "Create": "Create", - "Role": "Role", - "User": "User", - "No products found": "No products found", - "Category": "Category", - "Search results": "Search results", - "Add to cart": "Add to cart", - "Pay now": "Pay now", - "Customer details": "Customer details", - "Existing customer": "Existing customer", - "Forgotten": "Forgotten", - "Change customer": "Change customer", - "Enter a password to create an account for next time": "Enter a password to create an account for next time", - "Create account": "Create account", - "Your payment has been successfully processed": "Your payment has been successfully processed", - "Your payment has failed. Please try again or contact us.": "Your payment has failed. Please try again or contact us.", - "Please retain the details above as a reference of payment.": "Please retain the details above as a reference of payment.", - "Quantity": "Quantity", - "Leave a comment?": "Leave a comment?", - "Cart contents": "Cart contents", - "Shipping": "Shipping:", - "Empty cart": "Empty cart", - "List": "List", - "Order type": "Order type", - "New user": "New user", - "Payment ID": "Payment ID", - "Payment Message": "Payment Message", - "Password": "Password", - "Cart Email": "Cart Email", - "Information": "Information", - "Shipping options": "Shipping options", - "Proceed to payment": "Proceed to payment", - "Return to information": "Return to information", - "Search shop": "Search shop", - "Dashboard": "Dashboard", - "Create order": "Create order", - "Order shipping amount": "Order shipping amount", - "Order net amount": "Order net amount", - "Discount code": "Discount code", - "Apply": "Apply", - "Discount codes": "Discount codes", - "Code": "Code", - "Expiry": "Expiry", - "There are currently no discount codes setup.": "There are currently no discount codes setup.", - "New discount": "New discount", - "Amount": "Amount", - "Percent": "Percent", - "Discount type": "Discount type", - "Discount value": "Discount value", - "Discount": "Discount", - "Edit discount": "Edit discount", - "New Discount": "New Discount", - "Discount start": "Discount start", - "Discount end": "Discount end", - "Start": "Start", - "Running": "Running", - "Not running": "Not running", - "Menu": "Menu", - "Users": "Users", - "Create Order": "Create Order", - "User edit": "User edit", - "Blockonomics payment details": "Blockonomics payment details", + "Role": "Rol", + "User": "Utilizator", + "No products found": "Nu au fost găsite produse", + "Category": "Categorie", + "Search results": "Rezultate căutare", + "Add to cart": "Adauga in cos", + "Pay now": "Plătește acum", + "Customer details": "Detalii client", + "Existing customer": "Client existent", + "Forgotten": "Uitat", + "Change customer": "Schimbă client", + "Enter a password to create an account for next time": "Introduceți o parolă pentru a crea un cont pentru data viitoare", + "Create account": "Creați un cont", + "Your payment has been successfully processed": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", + "Your payment has failed. Please try again or contact us.": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", + "Please retain the details above as a reference of payment.": "Vă rugăm să păstrați detaliile de mai sus ca referință de plată.", + "Quantity": "Cantitate", + "Leave a comment?": "Lasă un comentariu?", + "Cart contents": "Conținutul coșului", + "Shipping": "Expediere:", + "Empty cart": "Coș gol", + "List": "Listă", + "Order type": "Tipul comenzii", + "New user": "Utilizator nou", + "Payment ID": "ID de plată", + "Payment Message": "Mesaj de plată", + "Password": "Parolă", + "Cart Email": "E-mail coș", + "Information": "Informații", + "Shipping options": "Opțiuni de expediere", + "Proceed to payment": "Treceți la plată", + "Return to information": "Reveniți la informații", + "Search shop": "Căutare magazin", + "Dashboard": "Tablou de bord", + "Create order": "Creați o comandă", + "Order shipping amount": "Suma de expediere a comenzii", + "Order net amount": "Suma netă a comenzii", + "Discount code": "Cod de reducere", + "Apply": "Aplică", + "Discount codes": "Coduri de reducere", + "Code": "Cod", + "Expiry": "Expirare", + "There are currently no discount codes setup.": "În prezent nu există configurarea codurilor de reducere.", + "New discount": "Reducere nouă", + "Amount": "Suma", + "Percent": "Procent", + "Discount type": "Tip de reducere", + "Discount value": "Valoarea reducerii", + "Discount": "Reducere", + "Edit discount": "Editați reducerea", + "New Discount": "Reducere nouă", + "Discount start": "Discount discount", + "Discount end": "Sfârșit de reducere", + "Start": "începe", + "Running": "Rulează", + "Not running": "Nu rulează", + "Menu": "Meniu", + "Users": "Utilizatori", + "Create Order": "Creați o comandă", + "User edit": "Modificarea utilizatorului", + "Blockonomics payment details": "Detaliile de plată Blockonomics", "Order Expected BTC": "Order Expected BTC", "Order Received BTC": "Order Received BTC", - "Order Blockonomics Txid": "Order Blockonomics Txid", - "Currency ISO": "Currency ISO", - "Currency used for Blockonomics conversion": "Currency used for Blockonomics conversion", - "Logout": "Logout", - "Company": "Company", - "View": "View", - "Related products": "Related products", - "Disable stock tracking": "Disable stock tracking", - "Company name": "Company name", - "Product variants": "Product variants", - "Shown in the variant dropdown": "Shown in the variant dropdown", - "Here you can set variants for your product. Eg: Size, color, style": "Here you can set variants for your product. Eg: Size, color, style", - "Product Order By": "Product Order By", - "Date": "Date", + "Order Blockonomics Txid": "Comanda Blockonomics Txid", + "Currency ISO": "Valută ISO", + "Currency used for Blockonomics conversion": "Monedă utilizată pentru conversia Blockonomics", + "Logout": "Deconectare", + "Company": "Companie", + "View": "Vizualizare", + "Related products": "Produse conexe", + "Disable stock tracking": "Dezactivează urmărirea stocului", + "Company name": "Nume companie", + "Product variants": "Variante de produs", + "Shown in the variant dropdown": "Afișat în varianta drop-down", + "Here you can set variants for your product. Eg: Size, color, style": "Aici puteți seta variante pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", + "Product Order By": "Comanda produsului după", + "Date": "Data", "Title": "Title", - "Select the field by which the product should be sorted when displayed in store.": "Select the field by which the product should be sorted when displayed in store.", - "Product Order": "Product Order", - "Descending": "Descending", - "Ascending": "Ascending", - "Select the order in which the products should be sorted.": "Select the order in which the products should be sorted.", - "Recent reviews": "Recent reviews", - "Reviews can be filtered by: review title or review description keywords": "Reviews can be filtered by: review title or review description keywords", - "Reviews": "Reviews", - "Product GTIN": "Product GTIN", - "The Serial number, GTIN or Barcode": "The Serial number, GTIN or Barcode", - "Product Brand": "Product Brand", - "The brand of the product": "The brand of the product" + "Select the field by which the product should be sorted when displayed in store.": "Selectați câmpul după care produsul trebuie sortat atunci când este afișat în magazin.", + "Product Order": "Comandă produs", + "Descending": "Descendent", + "Ascending": "Ascendent", + "Select the order in which the products should be sorted.": "Selectați ordinea în care trebuie sortate produsele.", + "Recent reviews": "Recenzii recente", + "Reviews can be filtered by: review title or review description keywords": "Recenziile pot fi filtrate după: titlul recenziei sau cuvintele cheie cu descrierea recenziei", + "Reviews": "Recenzii", + "Product GTIN": "Produs GTIN", + "The Serial number, GTIN or Barcode": "Numărul de serie, GTIN sau cod de bare", + "Product Brand": "Marca produsului", + "The brand of the product": "Marca produsului" } From 5b5bbc29d68c0d6efe72bc10269a7ecb04d7f1c6 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 17:38:10 +0300 Subject: [PATCH 12/79] add RO translations Signed-off-by: nick --- locales/ro.json | 420 ++++++++++++++++++++++++------------------------ 1 file changed, 210 insertions(+), 210 deletions(-) diff --git a/locales/ro.json b/locales/ro.json index b1af8f09..8afba403 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -3,228 +3,228 @@ "en": "Engleză", "it": "Italiană", "ro": "Română", - "Cart": "Cart", - "Name": "Name", - "New": "New", - "Settings": "Settings", - "General settings": "General settings", - "Address 1": "Address 1", - "Address 2": "Address 2", - "Country": "Country", - "State": "State", - "Postcode": "Postcode", - "Phone number": "Phone number", - "Creation date": "Creation date", - "Customers can be filtered by: email, name or phone number": "Customers can be filtered by: email, name or phone number", - "Customers": "Customers", - "Filtered term": "Filtered term", - "No orders found": "No orders found", - "Email address": "Email address", - "Please enter your email address": "Please enter your email address", + "Cart": "Coș", + "Name": "Nume", + "New": "Nou", + "Settings": "Setări", + "General settings": "Setări generale", + "Address 1": "Adresa 1", + "Address 2": "Adresa 2", + "Country": "Țară", + "State": "Județ", + "Postcode": "Cod poștal", + "Phone number": "Număr de telefon", + "Creation date": "Data creației", + "Customers can be filtered by: email, name or phone number": "Clienții pot fi filtrați după: e-mail, nume sau număr de telefon", + "Customers": "Clienți", + "Filtered term": "Termen filtrat", + "No orders found": "Nu s-au găsit comenzi", + "Email address": "Adresa de e-mail", + "Please enter your email address": "Vă rugăm să introduceți adresa de e-mail", "Reset": "Reset", - "Please sign in": "Please sign in", - "Sign in": "Sign in", - "Update status": "Update status", - "Go Back": "Go Back", - "Order date": "Order date", - "Order ID": "Order ID", + "Please sign in": "Vă rugăm să vă conectați", + "Sign in": "Conectați-vă", + "Update status": "Actualizați starea", + "Go Back": "Du-te înapoi", + "Order date": "Data comenzii", + "Order ID": "ID-ul comenzii", "Payment Gateway ref": "Payment Gateway ref", "Payment Gateway": "Payment Gateway", - "Order total amount": "Order total amount", - "First name": "First name", - "Last name": "Last name", - "Order comment": "Order comment", - "Products ordered": "Products ordered", - "Options": "Options", + "Order total amount": "Suma totală a comenzii", + "First name": "Prenume", + "Last name": "Numele de familie", + "Order comment": "Comandă comentariu", + "Products ordered": "Produse comandate", + "Options": "Opțiuni", "Filter": "Filter", - "By status": "By status", - "Orders can be filtered by: surname, email address or postcode/zipcode": "Orders can be filtered by: surname, email address or postcode/zipcode", - "Completed": "Completed", - "Paid": "Paid", - "Created": "Created", - "Cancelled": "Cancelled", - "Declined": "Declined", - "Shipped": "Shipped", - "Pending": "Pending", - "Orders": "Orders", - "Recent orders": "Recent orders", + "By status": "După statut", + "Orders can be filtered by: surname, email address or postcode/zipcode": "Comenzile pot fi filtrate după: prenume, adresă de e-mail sau cod poștal / cod poștal", + "Completed": "Finalizat", + "Paid": "Plătit", + "Created": "Creat", + "Cancelled": "Anulat", + "Declined": "Declinat", + "Shipped": "Expediat", + "Pending": "În așteptare", + "Orders": "Comenzi", + "Recent orders": "Comenzi recente", "Status": "Status", - "Upload image": "Upload image", - "Save product": "Save product", - "Edit product": "Edit product", - "Product title": "Product title", - "Product price": "Product price", - "Published": "Published", - "Draft": "Draft", - "Stock level": "Stock level", - "Product description": "Product description", - "Validate": "Validate", - "This sets a readable URL for the product": "This sets a readable URL for the product", - "Product options": "Product options", + "Upload image": "Încarcă imaginea", + "Save product": "Salvați produsul", + "Edit product": "Editați produsul", + "Product title": "Titlul produsului", + "Product price": "Preț produs", + "Published": "Publicat", + "Draft": "Proiect", + "Stock level": "Nivel stoc", + "Product description": "Descrierea produsului", + "Validate": "Validați", + "This sets a readable URL for the product": "Aceasta setează o adresă URL lizibilă pentru produs", + "Product options": "Opțiuni produs", "Label": "Label", "Type": "Type", - "Add": "Add", - "Remove": "Remove", - "Here you can set options for your product. Eg: Size, color, style": "Here you can set options for your product. Eg: Size, color, style", - "Allow comment": "Allow comment", - "Allow free form comments when adding products to cart": "Allow free form comments when adding products to cart", - "Product tag words": "Product tag words", - "Tag words used to indexed products, making them easier to find and filter.": "Tag words used to indexed products, making them easier to find and filter.", - "Product images": "Product images", - "Delete": "Delete", - "main image": "main image", - "Set as main image": "Set as main image", - "No images have been uploaded for this product": "No images have been uploaded for this product", - "Product image upload": "Product image upload", - "Select file": "Select file", - "Upload": "Upload", - "New product": "New product", - "Products can be filtered by: product title or product description keywords": "Products can be filtered by: product title or product description keywords", - "Products": "Products", - "Recent products": "Recent products", - "Confirm": "Confirm", - "Update": "Update", - "Setting_menu_explain": "Here you can setup a menu to displayed on your shopping cart. You can use this menu to filter your products by specifying a keyword in the \"link\" field. Eg: To show products with a keyword (or tag) of boots you would set the menu field to \"Backpacks\" and a link value \"backpack\". You can also use this menu to link to static pages, Eg: shipping, returns, help, about, contact etc.", - "Static page": "Static page", - "Page name": "Page name", - "A friendly name to manage the static page.": "A friendly name to manage the static page.", + "Add": "Adăugați", + "Remove": "Șterge", + "Here you can set options for your product. Eg: Size, color, style": "Aici puteți seta opțiuni pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", + "Allow comment": "Permiteți comentariul", + "Allow free form comments when adding products to cart": "Permiteți comentarii gratuite de formular atunci când adăugați produse în coș", + "Product tag words": "Cuvinte etichetă produs", + "Tag words used to indexed products, making them easier to find and filter.": "Etichetați cuvintele folosite la produsele indexate, făcându-le mai ușor de găsit și filtrat.", + "Product images": "Imagini de produs", + "Delete": "Șterge", + "main image": "imaginea principală", + "Set as main image": "Setați ca imagine principală", + "No images have been uploaded for this product": "Nu au fost încărcate imagini pentru acest produs", + "Product image upload": "Încărcare imagine produs", + "Select file": "Selectează fișierul", + "Upload": "Încărcare", + "New product": "Produs nou", + "Products can be filtered by: product title or product description keywords": "Produsele pot fi filtrate după: titlul produsului sau cuvintele cheie cu descrierea produsului", + "Products": "Produse", + "Recent products": "Produse recente", + "Confirm": "Confirmă", + "Update": "Actualizare", + "Setting_menu_explain": "ici puteți configura un meniu afișat în coșul dvs. de cumpărături. Puteți utiliza acest meniu pentru a filtra produsele dvs. specificând un cuvânt cheie în câmpul \\\" link \\ \". De exemplu: pentru a afișa produse cu un cuvânt cheie (sau etichetă) de cizme, ați seta câmpul de meniu la \\ \"Rucsacuri \\\" și o valoare a legăturii \\ \"rucsac \\\". De asemenea, puteți utiliza acest meniu pentru a vă conecta la pagini statice, de exemplu: expediere, returnări, ajutor, despre, contact etc. . \"", + "Static page": "Pagină statică", + "Page name": "Numele paginii", + "A friendly name to manage the static page.": "Un nume prietenos pentru a gestiona pagina statică.", "Page slug": "Page slug", - "Page_Slug_Description": "This is the relative URL of the page. Eg: A setting of \"about\" would make the page available at: mydomain.com/about", + "Page_Slug_Description": "TAceasta este adresa URL relativă a paginii. De exemplu: o setare de \\\" despre \\ \"ar face pagina disponibilă la: mydomain.com/about", "Page Enabled": "Page Enabled", - "Page content": "Page content", - "Here you can enter the content you wish to be displayed on your static page.": "Here you can enter the content you wish to be displayed on your static page.", - "New page": "New page", - "Static pages": "Static pages", - "Static_Pages_Info": "Here you can setup and manage static pages for your shopping cart. You may want to setup a page with a little bit about your business called \"About\" or \"Contact Us\" etc.", - "Edit": "Edit", - "There are currently no static pages setup. Please setup a static page.": "There are currently no static pages setup. Please setup a static page.", - "Create new": "Create new", - "Search": "Search", - "Cart name": "Cart name", - "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.", - "Cart description": "Cart description", - "This description shows when your website is listed in search engine results.": "This description shows when your website is listed in search engine results.", - "Cart image/logo": "Cart image/logo", - "Cart URL": "Cart URL", - "This URL is used in sitemaps and when your customer returns from completing their payment.": "This URL is used in sitemaps and when your customer returns from completing their payment.", - "This is used as the \"from\" email when sending receipts to your customers.": "This is used as the \"from\" email when sending receipts to your customers.", - "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.", - "Payment gateway": "Payment gateway", - "Payment_Gateway_Info": "You will also need to configure your payment gateway credentials in the `/config/.json` file.", - "Currency symbol": "Currency symbol", - "Set this to your currency symbol. Eg: $, £, €": "Set this to your currency symbol. Eg: $, £, €", - "Theme": "Theme", - "Theme_Info": "Themes are loaded from `/public/themes/`", - "Products per row": "Products per row", - "The number of products to be displayed across the page.": "The number of products to be displayed across the page.", - "Products per page": "Products per page", - "The number of products to be displayed on each page.": "The number of products to be displayed on each page.", + "Page content": "Conținutul paginii", + "Here you can enter the content you wish to be displayed on your static page.": "Aici puteți introduce conținutul pe care doriți să îl afișați pe pagina dvs. statică.", + "New page": "Pagină nouă", + "Static pages": "Pagini statice", + "Static_Pages_Info": "Aici puteți configura și gestiona pagini statice pentru coșul dvs. de cumpărături. Poate doriți să configurați o pagină cu un pic despre afacerea dvs. numită \\\" Despre \\ \"sau \\\" Contactați-ne \\ \"etc.", + "Edit": "Editează", + "There are currently no static pages setup. Please setup a static page.": "În prezent nu există configurarea paginilor statice. Vă rugăm să configurați o pagină statică.", + "Create new": "Creați un nou", + "Search": "Căutare", + "Cart name": "Numele coșului", + "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "Acest element este esențial pentru optimizarea motorului de căutare. Ca rt title este afișat dacă sigla dvs. este ascunsă..", + "Cart description": "Descrierea coșului", + "This description shows when your website is listed in search engine results.": "Această descriere arată când site-ul dvs. web este listat în rezultatele motorului de căutare.", + "Cart image/logo": "Imagine coș / logo", + "Cart URL": "Adresă URL coș", + "This URL is used in sitemaps and when your customer returns from completing their payment.": "Această adresă URL este utilizată în sitemapuri și atunci când clientul dvs. se întoarce după finalizarea plății.", + "This is used as the \"from\" email when sending receipts to your customers.": "Aceasta este utilizată ca e-mail \\\" din \\ \"la trimiterea de chitanțe către clienții dvs.", + "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Comenzile peste această valoare vor însemna că livrarea va fi GRATUITă. Setați la valoare ridicată dacă vreți să încărcați întotdeauna livrare.", + "Payment gateway": "Gateway de plată", + "Payment_Gateway_Info": "De asemenea, va trebui să vă configurați acreditările gateway-ului de plată în fișierul` / config / .json`..", + "Currency symbol": "Simbol valutar", + "Set this to your currency symbol. Eg: $, £, €": "Setați acest simbol la moneda dvs. De exemplu: $, £, €", + "Theme": "Tema", + "Theme_Info": "Temele sunt încărcate din` /views/themes/`", + "Products per row": "Produse pe rând", + "The number of products to be displayed across the page.": "Numărul de produse care trebuie afișate pe toată pagina.", + "Products per page": "Produse pe pagină", + "The number of products to be displayed on each page.": "Numărul de produse care trebuie afișate pe fiecare pagină.", "Menu Enabled": "Menu Enabled", - "Menu_Enabled_Info": "If a menu is set you can set it up here.", - "Menu header": "Menu header", - "The heading text for your menu.": "The heading text for your menu.", - "Menu location": "Menu location", - "The location of your menu.": "The location of your menu.", - "Google_Analytics_Info": "Your Google Analytics code. Please also inlude the \"script\" tags - Help", - "Custom CSS": "Custom CSS", - "Send test email": "Send test email", - "Users name": "Users name", - "User email": "User email", - "Password confirm": "Password confirm", - "User password": "User password", - "Complete setup": "Complete setup", - "User is admin?": "User is admin?", - "Generate": "Generate", - "New User": "New User", + "Menu_Enabled_Info": "Dacă este setat un meniu, îl puteți configura aici .", + "Menu header": "Antet meniu", + "The heading text for your menu.": "Textul antetului pentru meniul dvs.", + "Menu location": "Locația meniu", + "The location of your menu.": "Locația meniului dvs.", + "Google_Analytics_Info": "Codul dvs. Google Analytics. Includeți și etichetele \" script \"- Ajutor ", + "Custom CSS": "CSS personalizat", + "Send test email": "Trimiteți e-mailul de testare", + "Users name": "Numele utilizatorilor", + "User email": "Email utilizator", + "Password confirm": "Confirmare parolă", + "User password": "Parola de utilizator", + "Complete setup": "Configurare completă", + "User is admin?": "Utilizatorul este administrator?", + "Generate": "Generați", + "New User": "Utilizator nou", "Create": "Create", - "Role": "Role", - "User": "User", - "No products found": "No products found", - "Category": "Category", - "Search results": "Search results", - "Add to cart": "Add to cart", - "Pay now": "Pay now", - "Customer details": "Customer details", - "Existing customer": "Existing customer", - "Forgotten": "Forgotten", - "Change customer": "Change customer", - "Enter a password to create an account for next time": "Enter a password to create an account for next time", - "Create account": "Create account", - "Your payment has been successfully processed": "Your payment has been successfully processed", - "Your payment has failed. Please try again or contact us.": "Your payment has failed. Please try again or contact us.", - "Please retain the details above as a reference of payment.": "Please retain the details above as a reference of payment.", - "Quantity": "Quantity", - "Leave a comment?": "Leave a comment?", - "Cart contents": "Cart contents", - "Shipping": "Shipping:", - "Empty cart": "Empty cart", - "List": "List", - "Order type": "Order type", - "New user": "New user", - "Payment ID": "Payment ID", - "Payment Message": "Payment Message", - "Password": "Password", - "Cart Email": "Cart Email", - "Information": "Information", - "Shipping options": "Shipping options", - "Proceed to payment": "Proceed to payment", - "Return to information": "Return to information", - "Search shop": "Search shop", - "Dashboard": "Dashboard", - "Create order": "Create order", - "Order shipping amount": "Order shipping amount", - "Order net amount": "Order net amount", - "Discount code": "Discount code", - "Apply": "Apply", - "Discount codes": "Discount codes", - "Code": "Code", - "Expiry": "Expiry", - "There are currently no discount codes setup.": "There are currently no discount codes setup.", - "New discount": "New discount", - "Amount": "Amount", - "Percent": "Percent", - "Discount type": "Discount type", - "Discount value": "Discount value", - "Discount": "Discount", - "Edit discount": "Edit discount", - "New Discount": "New Discount", - "Discount start": "Discount start", - "Discount end": "Discount end", - "Start": "Start", - "Running": "Running", - "Not running": "Not running", - "Menu": "Menu", - "Users": "Users", - "Create Order": "Create Order", - "User edit": "User edit", - "Blockonomics payment details": "Blockonomics payment details", + "Role": "Rol", + "User": "Utilizator", + "No products found": "Nu au fost găsite produse", + "Category": "Categorie", + "Search results": "Rezultate căutare", + "Add to cart": "Adauga in cos", + "Pay now": "Plătește acum", + "Customer details": "Detalii client", + "Existing customer": "Client existent", + "Forgotten": "Uitat", + "Change customer": "Schimbă client", + "Enter a password to create an account for next time": "Introduceți o parolă pentru a crea un cont pentru data viitoare", + "Create account": "Creați un cont", + "Your payment has been successfully processed": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", + "Your payment has failed. Please try again or contact us.": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", + "Please retain the details above as a reference of payment.": "Vă rugăm să păstrați detaliile de mai sus ca referință de plată.", + "Quantity": "Cantitate", + "Leave a comment?": "Lasă un comentariu?", + "Cart contents": "Conținutul coșului", + "Shipping": "Expediere:", + "Empty cart": "Coș gol", + "List": "Listă", + "Order type": "Tipul comenzii", + "New user": "Utilizator nou", + "Payment ID": "ID de plată", + "Payment Message": "Mesaj de plată", + "Password": "Parolă", + "Cart Email": "E-mail coș", + "Information": "Informații", + "Shipping options": "Opțiuni de expediere", + "Proceed to payment": "Treceți la plată", + "Return to information": "Reveniți la informații", + "Search shop": "Căutare magazin", + "Dashboard": "Tablou de bord", + "Create order": "Creați o comandă", + "Order shipping amount": "Suma de expediere a comenzii", + "Order net amount": "Suma netă a comenzii", + "Discount code": "Cod de reducere", + "Apply": "Aplică", + "Discount codes": "Coduri de reducere", + "Code": "Cod", + "Expiry": "Expirare", + "There are currently no discount codes setup.": "În prezent nu există configurarea codurilor de reducere.", + "New discount": "Reducere nouă", + "Amount": "Suma", + "Percent": "Procent", + "Discount type": "Tip de reducere", + "Discount value": "Valoarea reducerii", + "Discount": "Reducere", + "Edit discount": "Editați reducerea", + "New Discount": "Reducere nouă", + "Discount start": "Discount discount", + "Discount end": "Sfârșit de reducere", + "Start": "începe", + "Running": "Rulează", + "Not running": "Nu rulează", + "Menu": "Meniu", + "Users": "Utilizatori", + "Create Order": "Creați o comandă", + "User edit": "Modificarea utilizatorului", + "Blockonomics payment details": "Detaliile de plată Blockonomics", "Order Expected BTC": "Order Expected BTC", "Order Received BTC": "Order Received BTC", - "Order Blockonomics Txid": "Order Blockonomics Txid", - "Currency ISO": "Currency ISO", - "Currency used for Blockonomics conversion": "Currency used for Blockonomics conversion", - "Logout": "Logout", - "Company": "Company", - "View": "View", - "Related products": "Related products", - "Disable stock tracking": "Disable stock tracking", - "Company name": "Company name", - "Product variants": "Product variants", - "Shown in the variant dropdown": "Shown in the variant dropdown", - "Here you can set variants for your product. Eg: Size, color, style": "Here you can set variants for your product. Eg: Size, color, style", - "Product Order By": "Product Order By", - "Date": "Date", + "Order Blockonomics Txid": "Comanda Blockonomics Txid", + "Currency ISO": "Valută ISO", + "Currency used for Blockonomics conversion": "Monedă utilizată pentru conversia Blockonomics", + "Logout": "Deconectare", + "Company": "Companie", + "View": "Vizualizare", + "Related products": "Produse conexe", + "Disable stock tracking": "Dezactivează urmărirea stocului", + "Company name": "Nume companie", + "Product variants": "Variante de produs", + "Shown in the variant dropdown": "Afișat în varianta drop-down", + "Here you can set variants for your product. Eg: Size, color, style": "Aici puteți seta variante pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", + "Product Order By": "Comanda produsului după", + "Date": "Data", "Title": "Title", - "Select the field by which the product should be sorted when displayed in store.": "Select the field by which the product should be sorted when displayed in store.", - "Product Order": "Product Order", - "Descending": "Descending", - "Ascending": "Ascending", - "Select the order in which the products should be sorted.": "Select the order in which the products should be sorted.", - "Recent reviews": "Recent reviews", - "Reviews can be filtered by: review title or review description keywords": "Reviews can be filtered by: review title or review description keywords", - "Reviews": "Reviews", - "Product GTIN": "Product GTIN", - "The Serial number, GTIN or Barcode": "The Serial number, GTIN or Barcode", - "Product Brand": "Product Brand", - "The brand of the product": "The brand of the product" + "Select the field by which the product should be sorted when displayed in store.": "Selectați câmpul după care produsul trebuie sortat atunci când este afișat în magazin.", + "Product Order": "Comandă produs", + "Descending": "Descendent", + "Ascending": "Ascendent", + "Select the order in which the products should be sorted.": "Selectați ordinea în care trebuie sortate produsele.", + "Recent reviews": "Recenzii recente", + "Reviews can be filtered by: review title or review description keywords": "Recenziile pot fi filtrate după: titlul recenziei sau cuvintele cheie cu descrierea recenziei", + "Reviews": "Recenzii", + "Product GTIN": "Produs GTIN", + "The Serial number, GTIN or Barcode": "Numărul de serie, GTIN sau cod de bare", + "Product Brand": "Marca produsului", + "The brand of the product": "Marca produsului" } From ad095bdd915520a94c0459f18c0f38caa28704b6 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 18:34:08 +0300 Subject: [PATCH 13/79] current version didn't work for me, bumping it solved the issue --- package-lock.json | 58 +++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1383bf49..5624b915 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1355,6 +1355,15 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3359,6 +3368,23 @@ "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==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + } + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -3513,7 +3539,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -4938,6 +4963,11 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.1.tgz", "integrity": "sha512-HgcGMooY4JC2PBt9sdUdJ6PMzpin+YtY3r/7wg0uTifP+HJWW8rammseSEHuyt0UeShI183UGssCJqm1bJR7QA==" }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -6550,6 +6580,16 @@ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", "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==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -6791,17 +6831,21 @@ "dev": true }, "stripe": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-7.12.0.tgz", - "integrity": "sha512-h/NMB7E+0WgDuEOdfrS9giYmTfQRvOoKHdYaKzo9V0hxilXopVJd3ZZQ47193rAOHjIhmuCDtQRb3gEEm24gKg==", + "version": "8.170.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-8.170.0.tgz", + "integrity": "sha512-1fM9K+WHCHIGAurcf5UYqqUP7LRR+FBcjx4JA+MoH4YqH6/Bi2Xm50O0lMbf3C/iuUg+tuGlFzeqVBsnqIZuEA==", "requires": { + "@types/node": ">=8.1.0", "qs": "^6.6.0" }, "dependencies": { "qs": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", - "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==" + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } } } }, diff --git a/package.json b/package.json index e83c11cc..73561b26 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "sitemap": "^1.6.0", "string-strip-html": "^4.3.14", "strip-bom": "^3.0.0", - "stripe": "^7.12.0", + "stripe": "^8.170.0", "uglifycss": "0.0.27", "xml-js": "^1.6.11", "yenv": "^2.1.1" From f3ddbeef170e34fa79051930d806920feeabc82d Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Aug 2021 18:37:21 +0300 Subject: [PATCH 14/79] running on a deprecated LTS is not recomended? bumped it to 14. seems to work fine. --- Dockerfile | 4 ++-- docker-compose.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index b3754905..ba0308e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM mhart/alpine-node:8 +FROM mhart/alpine-node:14.17.3 -ENV NODE_VERSION 8.9.4 +ENV NODE_VERSION 14.17.3 RUN apk add --no-cache make gcc g++ python bash diff --git a/docker-compose.yml b/docker-compose.yml index e2103f89..19c741fa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3' services: expresscart: - image: "node:8" + image: "node:14.17.3" build: . container_name: "expresscart" environment: From c5aa55bc2512a587419abae195a27fb942dc1de1 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 27 Aug 2021 16:12:21 +0300 Subject: [PATCH 15/79] fixed a lot of missing I18N fixed strings Signed-off-by: nick --- config/settings.json | 9 +- lib/modules/shipping-basic.js | 8 +- locales/en.json | 16 +- locales/ro.json | 469 ++++++++++---------- views/order-create.hbs | 22 +- views/partials/reviewModal.hbs | 18 +- views/themes/Cloth/cart.hbs | 14 +- views/themes/Cloth/checkout-cart.hbs | 4 +- views/themes/Cloth/checkout-information.hbs | 20 +- views/themes/Cloth/shipping-form.hbs | 26 +- 10 files changed, 317 insertions(+), 289 deletions(-) diff --git a/config/settings.json b/config/settings.json index c3cfc862..c9b23578 100644 --- a/config/settings.json +++ b/config/settings.json @@ -18,7 +18,7 @@ "currencySymbol": "£", "currencyISO": "USD", "paymentGateway": [ - "stripe" + "stripe" ], "databaseConnectionString": "mongodb://127.0.0.1:27017/expresscart", "theme": "Cloth", @@ -26,9 +26,10 @@ "orderHook": "", "availableLanguages": [ "en", - "it" + "it", + "ro" ], - "defaultLocale": "en", + "defaultLocale": "ro", "maxQuantity": 25, "twitterHandle": "", "facebookAppId": "", @@ -48,4 +49,4 @@ }, "showRelatedProducts": true, "showHomepageVariants": false -} \ No newline at end of file +} diff --git a/lib/modules/shipping-basic.js b/lib/modules/shipping-basic.js index db3e589f..d894e379 100644 --- a/lib/modules/shipping-basic.js +++ b/lib/modules/shipping-basic.js @@ -5,7 +5,7 @@ const shippingFromCountry = 'Australia'; const calculateShipping = (amount, config, req) => { if(amount >= freeThreshold){ - req.session.shippingMessage = 'FREE shipping'; + req.session.shippingMessage = req.__('FREE shipping'); req.session.totalCartShipping = 0; req.session.totalCartAmount = req.session.totalCartAmount + 0; return; @@ -13,7 +13,7 @@ const calculateShipping = (amount, config, req) => { // If there is no country set, we estimate shipping if(!req.session.customerCountry){ - req.session.shippingMessage = 'Estimated shipping'; + req.session.shippingMessage = req.__('Estimated shipping'); req.session.totalCartShipping = domesticShippingAmount; req.session.totalCartAmount = amount + domesticShippingAmount; return; @@ -21,14 +21,14 @@ const calculateShipping = (amount, config, req) => { // Check for international if(req.session.customerCountry.toLowerCase() !== shippingFromCountry.toLowerCase()){ - req.session.shippingMessage = 'International shipping'; + req.session.shippingMessage = req.__('International shipping'); req.session.totalCartShipping = internationalShippingAmount; req.session.totalCartAmount = amount + internationalShippingAmount; return; } // Domestic shipping - req.session.shippingMessage = 'Domestic shipping'; + req.session.shippingMessage = req.__('Domestic shipping'); req.session.totalCartShipping = domesticShippingAmount; req.session.totalCartAmount = amount + domesticShippingAmount; }; diff --git a/locales/en.json b/locales/en.json index 2991b03b..f28a0c7a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -226,5 +226,19 @@ "Product GTIN": "Product GTIN", "The Serial number, GTIN or Barcode": "The Serial number, GTIN or Barcode", "Product Brand": "Product Brand", - "The brand of the product": "The brand of the product" + "The brand of the product": "The brand of the product", + "Cart Empty": "Cart Empty", + "Estimated shipping": "Estimated shipping", + "Please enter a valid email address": "Please enter a valid email address", + "Address 2 (optional)": "Address 2 (optional)", + "Select Country": "Select Country", + "Post code": "Post code", + "Cancel": "Cancel", + "Add review": "Add review", + "Product review": "Product review", + "Love it": "Love it", + "Description": "Description", + "Product is great. Does everything it said it can do.": "Product is great. Does everything it said it can do.", + "Rating": "Rating" + } diff --git a/locales/ro.json b/locales/ro.json index 8afba403..3b1d9888 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -1,230 +1,243 @@ { - "Languages": "Languages", - "en": "Engleză", - "it": "Italiană", - "ro": "Română", - "Cart": "Coș", - "Name": "Nume", - "New": "Nou", - "Settings": "Setări", - "General settings": "Setări generale", - "Address 1": "Adresa 1", - "Address 2": "Adresa 2", - "Country": "Țară", - "State": "Județ", - "Postcode": "Cod poștal", - "Phone number": "Număr de telefon", - "Creation date": "Data creației", - "Customers can be filtered by: email, name or phone number": "Clienții pot fi filtrați după: e-mail, nume sau număr de telefon", - "Customers": "Clienți", - "Filtered term": "Termen filtrat", - "No orders found": "Nu s-au găsit comenzi", - "Email address": "Adresa de e-mail", - "Please enter your email address": "Vă rugăm să introduceți adresa de e-mail", - "Reset": "Reset", - "Please sign in": "Vă rugăm să vă conectați", - "Sign in": "Conectați-vă", - "Update status": "Actualizați starea", - "Go Back": "Du-te înapoi", - "Order date": "Data comenzii", - "Order ID": "ID-ul comenzii", - "Payment Gateway ref": "Payment Gateway ref", - "Payment Gateway": "Payment Gateway", - "Order total amount": "Suma totală a comenzii", - "First name": "Prenume", - "Last name": "Numele de familie", - "Order comment": "Comandă comentariu", - "Products ordered": "Produse comandate", - "Options": "Opțiuni", - "Filter": "Filter", - "By status": "După statut", - "Orders can be filtered by: surname, email address or postcode/zipcode": "Comenzile pot fi filtrate după: prenume, adresă de e-mail sau cod poștal / cod poștal", - "Completed": "Finalizat", - "Paid": "Plătit", - "Created": "Creat", - "Cancelled": "Anulat", - "Declined": "Declinat", - "Shipped": "Expediat", - "Pending": "În așteptare", - "Orders": "Comenzi", - "Recent orders": "Comenzi recente", - "Status": "Status", - "Upload image": "Încarcă imaginea", - "Save product": "Salvați produsul", - "Edit product": "Editați produsul", - "Product title": "Titlul produsului", - "Product price": "Preț produs", - "Published": "Publicat", - "Draft": "Proiect", - "Stock level": "Nivel stoc", - "Product description": "Descrierea produsului", - "Validate": "Validați", - "This sets a readable URL for the product": "Aceasta setează o adresă URL lizibilă pentru produs", - "Product options": "Opțiuni produs", - "Label": "Label", - "Type": "Type", - "Add": "Adăugați", - "Remove": "Șterge", - "Here you can set options for your product. Eg: Size, color, style": "Aici puteți seta opțiuni pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", - "Allow comment": "Permiteți comentariul", - "Allow free form comments when adding products to cart": "Permiteți comentarii gratuite de formular atunci când adăugați produse în coș", - "Product tag words": "Cuvinte etichetă produs", - "Tag words used to indexed products, making them easier to find and filter.": "Etichetați cuvintele folosite la produsele indexate, făcându-le mai ușor de găsit și filtrat.", - "Product images": "Imagini de produs", - "Delete": "Șterge", - "main image": "imaginea principală", - "Set as main image": "Setați ca imagine principală", - "No images have been uploaded for this product": "Nu au fost încărcate imagini pentru acest produs", - "Product image upload": "Încărcare imagine produs", - "Select file": "Selectează fișierul", - "Upload": "Încărcare", - "New product": "Produs nou", - "Products can be filtered by: product title or product description keywords": "Produsele pot fi filtrate după: titlul produsului sau cuvintele cheie cu descrierea produsului", - "Products": "Produse", - "Recent products": "Produse recente", - "Confirm": "Confirmă", - "Update": "Actualizare", - "Setting_menu_explain": "ici puteți configura un meniu afișat în coșul dvs. de cumpărături. Puteți utiliza acest meniu pentru a filtra produsele dvs. specificând un cuvânt cheie în câmpul \\\" link \\ \". De exemplu: pentru a afișa produse cu un cuvânt cheie (sau etichetă) de cizme, ați seta câmpul de meniu la \\ \"Rucsacuri \\\" și o valoare a legăturii \\ \"rucsac \\\". De asemenea, puteți utiliza acest meniu pentru a vă conecta la pagini statice, de exemplu: expediere, returnări, ajutor, despre, contact etc. . \"", - "Static page": "Pagină statică", - "Page name": "Numele paginii", - "A friendly name to manage the static page.": "Un nume prietenos pentru a gestiona pagina statică.", - "Page slug": "Page slug", - "Page_Slug_Description": "TAceasta este adresa URL relativă a paginii. De exemplu: o setare de \\\" despre \\ \"ar face pagina disponibilă la: mydomain.com/about", - "Page Enabled": "Page Enabled", - "Page content": "Conținutul paginii", - "Here you can enter the content you wish to be displayed on your static page.": "Aici puteți introduce conținutul pe care doriți să îl afișați pe pagina dvs. statică.", - "New page": "Pagină nouă", - "Static pages": "Pagini statice", - "Static_Pages_Info": "Aici puteți configura și gestiona pagini statice pentru coșul dvs. de cumpărături. Poate doriți să configurați o pagină cu un pic despre afacerea dvs. numită \\\" Despre \\ \"sau \\\" Contactați-ne \\ \"etc.", - "Edit": "Editează", - "There are currently no static pages setup. Please setup a static page.": "În prezent nu există configurarea paginilor statice. Vă rugăm să configurați o pagină statică.", - "Create new": "Creați un nou", - "Search": "Căutare", - "Cart name": "Numele coșului", - "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "Acest element este esențial pentru optimizarea motorului de căutare. Ca rt title este afișat dacă sigla dvs. este ascunsă..", - "Cart description": "Descrierea coșului", - "This description shows when your website is listed in search engine results.": "Această descriere arată când site-ul dvs. web este listat în rezultatele motorului de căutare.", - "Cart image/logo": "Imagine coș / logo", - "Cart URL": "Adresă URL coș", - "This URL is used in sitemaps and when your customer returns from completing their payment.": "Această adresă URL este utilizată în sitemapuri și atunci când clientul dvs. se întoarce după finalizarea plății.", - "This is used as the \"from\" email when sending receipts to your customers.": "Aceasta este utilizată ca e-mail \\\" din \\ \"la trimiterea de chitanțe către clienții dvs.", - "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Comenzile peste această valoare vor însemna că livrarea va fi GRATUITă. Setați la valoare ridicată dacă vreți să încărcați întotdeauna livrare.", - "Payment gateway": "Gateway de plată", - "Payment_Gateway_Info": "De asemenea, va trebui să vă configurați acreditările gateway-ului de plată în fișierul` / config / .json`..", - "Currency symbol": "Simbol valutar", - "Set this to your currency symbol. Eg: $, £, €": "Setați acest simbol la moneda dvs. De exemplu: $, £, €", - "Theme": "Tema", - "Theme_Info": "Temele sunt încărcate din` /views/themes/`", - "Products per row": "Produse pe rând", - "The number of products to be displayed across the page.": "Numărul de produse care trebuie afișate pe toată pagina.", - "Products per page": "Produse pe pagină", - "The number of products to be displayed on each page.": "Numărul de produse care trebuie afișate pe fiecare pagină.", - "Menu Enabled": "Menu Enabled", - "Menu_Enabled_Info": "Dacă este setat un meniu, îl puteți configura aici .", - "Menu header": "Antet meniu", - "The heading text for your menu.": "Textul antetului pentru meniul dvs.", - "Menu location": "Locația meniu", - "The location of your menu.": "Locația meniului dvs.", - "Google_Analytics_Info": "Codul dvs. Google Analytics. Includeți și etichetele \" script \"- Ajutor ", - "Custom CSS": "CSS personalizat", - "Send test email": "Trimiteți e-mailul de testare", - "Users name": "Numele utilizatorilor", - "User email": "Email utilizator", - "Password confirm": "Confirmare parolă", - "User password": "Parola de utilizator", - "Complete setup": "Configurare completă", - "User is admin?": "Utilizatorul este administrator?", - "Generate": "Generați", - "New User": "Utilizator nou", - "Create": "Create", - "Role": "Rol", - "User": "Utilizator", - "No products found": "Nu au fost găsite produse", - "Category": "Categorie", - "Search results": "Rezultate căutare", - "Add to cart": "Adauga in cos", - "Pay now": "Plătește acum", - "Customer details": "Detalii client", - "Existing customer": "Client existent", - "Forgotten": "Uitat", - "Change customer": "Schimbă client", - "Enter a password to create an account for next time": "Introduceți o parolă pentru a crea un cont pentru data viitoare", - "Create account": "Creați un cont", - "Your payment has been successfully processed": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", - "Your payment has failed. Please try again or contact us.": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", - "Please retain the details above as a reference of payment.": "Vă rugăm să păstrați detaliile de mai sus ca referință de plată.", - "Quantity": "Cantitate", - "Leave a comment?": "Lasă un comentariu?", - "Cart contents": "Conținutul coșului", - "Shipping": "Expediere:", - "Empty cart": "Coș gol", - "List": "Listă", - "Order type": "Tipul comenzii", - "New user": "Utilizator nou", - "Payment ID": "ID de plată", - "Payment Message": "Mesaj de plată", - "Password": "Parolă", - "Cart Email": "E-mail coș", - "Information": "Informații", - "Shipping options": "Opțiuni de expediere", - "Proceed to payment": "Treceți la plată", - "Return to information": "Reveniți la informații", - "Search shop": "Căutare magazin", - "Dashboard": "Tablou de bord", - "Create order": "Creați o comandă", - "Order shipping amount": "Suma de expediere a comenzii", - "Order net amount": "Suma netă a comenzii", - "Discount code": "Cod de reducere", - "Apply": "Aplică", - "Discount codes": "Coduri de reducere", - "Code": "Cod", - "Expiry": "Expirare", - "There are currently no discount codes setup.": "În prezent nu există configurarea codurilor de reducere.", - "New discount": "Reducere nouă", - "Amount": "Suma", - "Percent": "Procent", - "Discount type": "Tip de reducere", - "Discount value": "Valoarea reducerii", - "Discount": "Reducere", - "Edit discount": "Editați reducerea", - "New Discount": "Reducere nouă", - "Discount start": "Discount discount", - "Discount end": "Sfârșit de reducere", - "Start": "începe", - "Running": "Rulează", - "Not running": "Nu rulează", - "Menu": "Meniu", - "Users": "Utilizatori", - "Create Order": "Creați o comandă", - "User edit": "Modificarea utilizatorului", - "Blockonomics payment details": "Detaliile de plată Blockonomics", - "Order Expected BTC": "Order Expected BTC", - "Order Received BTC": "Order Received BTC", - "Order Blockonomics Txid": "Comanda Blockonomics Txid", - "Currency ISO": "Valută ISO", - "Currency used for Blockonomics conversion": "Monedă utilizată pentru conversia Blockonomics", - "Logout": "Deconectare", - "Company": "Companie", - "View": "Vizualizare", - "Related products": "Produse conexe", - "Disable stock tracking": "Dezactivează urmărirea stocului", - "Company name": "Nume companie", - "Product variants": "Variante de produs", - "Shown in the variant dropdown": "Afișat în varianta drop-down", - "Here you can set variants for your product. Eg: Size, color, style": "Aici puteți seta variante pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", - "Product Order By": "Comanda produsului după", - "Date": "Data", - "Title": "Title", - "Select the field by which the product should be sorted when displayed in store.": "Selectați câmpul după care produsul trebuie sortat atunci când este afișat în magazin.", - "Product Order": "Comandă produs", - "Descending": "Descendent", - "Ascending": "Ascendent", - "Select the order in which the products should be sorted.": "Selectați ordinea în care trebuie sortate produsele.", - "Recent reviews": "Recenzii recente", - "Reviews can be filtered by: review title or review description keywords": "Recenziile pot fi filtrate după: titlul recenziei sau cuvintele cheie cu descrierea recenziei", - "Reviews": "Recenzii", - "Product GTIN": "Produs GTIN", - "The Serial number, GTIN or Barcode": "Numărul de serie, GTIN sau cod de bare", - "Product Brand": "Marca produsului", - "The brand of the product": "Marca produsului" + "Languages": "Languages", + "en": "Engleză", + "it": "Italiană", + "ro": "Română", + "Cart": "Coș", + "Name": "Nume", + "New": "Nou", + "Settings": "Setări", + "General settings": "Setări generale", + "Address 1": "Adresa 1", + "Address 2": "Adresa 2", + "Country": "Țară", + "State": "Județ", + "Postcode": "Cod poștal", + "Phone number": "Număr de telefon", + "Creation date": "Data creației", + "Customers can be filtered by: email, name or phone number": "Clienții pot fi filtrați după: e-mail, nume sau număr de telefon", + "Customers": "Clienți", + "Filtered term": "Termen filtrat", + "No orders found": "Nu s-au găsit comenzi", + "Email address": "Adresa de e-mail", + "Please enter your email address": "Vă rugăm să introduceți adresa de e-mail", + "Reset": "Reset", + "Please sign in": "Vă rugăm să vă conectați", + "Sign in": "Conectați-vă", + "Update status": "Actualizați starea", + "Go Back": "Du-te înapoi", + "Order date": "Data comenzii", + "Order ID": "ID-ul comenzii", + "Payment Gateway ref": "Payment Gateway ref", + "Payment Gateway": "Payment Gateway", + "Order total amount": "Suma totală a comenzii", + "First name": "Prenume", + "Last name": "Numele de familie", + "Order comment": "Comandă comentariu", + "Products ordered": "Produse comandate", + "Options": "Opțiuni", + "Filter": "Filter", + "By status": "După statut", + "Orders can be filtered by: surname, email address or postcode/zipcode": "Comenzile pot fi filtrate după: prenume, adresă de e-mail sau cod poștal / cod poștal", + "Completed": "Finalizat", + "Paid": "Plătit", + "Created": "Creat", + "Cancelled": "Anulat", + "Declined": "Declinat", + "Shipped": "Expediat", + "Pending": "În așteptare", + "Orders": "Comenzi", + "Recent orders": "Comenzi recente", + "Status": "Status", + "Upload image": "Încarcă imaginea", + "Save product": "Salvați produsul", + "Edit product": "Editați produsul", + "Product title": "Titlul produsului", + "Product price": "Preț produs", + "Published": "Publicat", + "Draft": "Proiect", + "Stock level": "Nivel stoc", + "Product description": "Descrierea produsului", + "Validate": "Validați", + "This sets a readable URL for the product": "Aceasta setează o adresă URL lizibilă pentru produs", + "Product options": "Opțiuni produs", + "Label": "Label", + "Type": "Type", + "Add": "Adăugați", + "Remove": "Șterge", + "Here you can set options for your product. Eg: Size, color, style": "Aici puteți seta opțiuni pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", + "Allow comment": "Permiteți comentariul", + "Allow free form comments when adding products to cart": "Permiteți comentarii gratuite de formular atunci când adăugați produse în coș", + "Product tag words": "Cuvinte etichetă produs", + "Tag words used to indexed products, making them easier to find and filter.": "Etichetați cuvintele folosite la produsele indexate, făcându-le mai ușor de găsit și filtrat.", + "Product images": "Imagini de produs", + "Delete": "Șterge", + "main image": "imaginea principală", + "Set as main image": "Setați ca imagine principală", + "No images have been uploaded for this product": "Nu au fost încărcate imagini pentru acest produs", + "Product image upload": "Încărcare imagine produs", + "Select file": "Selectează fișierul", + "Upload": "Încărcare", + "New product": "Produs nou", + "Products can be filtered by: product title or product description keywords": "Produsele pot fi filtrate după: titlul produsului sau cuvintele cheie cu descrierea produsului", + "Products": "Produse", + "Recent products": "Produse recente", + "Confirm": "Confirmă", + "Update": "Actualizare", + "Setting_menu_explain": "ici puteți configura un meniu afișat în coșul dvs. de cumpărături. Puteți utiliza acest meniu pentru a filtra produsele dvs. specificând un cuvânt cheie în câmpul \\\" link \\ \". De exemplu: pentru a afișa produse cu un cuvânt cheie (sau etichetă) de cizme, ați seta câmpul de meniu la \\ \"Rucsacuri \\\" și o valoare a legăturii \\ \"rucsac \\\". De asemenea, puteți utiliza acest meniu pentru a vă conecta la pagini statice, de exemplu: expediere, returnări, ajutor, despre, contact etc. . \"", + "Static page": "Pagină statică", + "Page name": "Numele paginii", + "A friendly name to manage the static page.": "Un nume prietenos pentru a gestiona pagina statică.", + "Page slug": "Page slug", + "Page_Slug_Description": "TAceasta este adresa URL relativă a paginii. De exemplu: o setare de \\\" despre \\ \"ar face pagina disponibilă la: mydomain.com/about", + "Page Enabled": "Page Enabled", + "Page content": "Conținutul paginii", + "Here you can enter the content you wish to be displayed on your static page.": "Aici puteți introduce conținutul pe care doriți să îl afișați pe pagina dvs. statică.", + "New page": "Pagină nouă", + "Static pages": "Pagini statice", + "Static_Pages_Info": "Aici puteți configura și gestiona pagini statice pentru coșul dvs. de cumpărături. Poate doriți să configurați o pagină cu un pic despre afacerea dvs. numită \\\" Despre \\ \"sau \\\" Contactați-ne \\ \"etc.", + "Edit": "Editează", + "There are currently no static pages setup. Please setup a static page.": "În prezent nu există configurarea paginilor statice. Vă rugăm să configurați o pagină statică.", + "Create new": "Creați un nou", + "Search": "Căutare", + "Cart name": "Numele coșului", + "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "Acest element este esențial pentru optimizarea motorului de căutare. Ca rt title este afișat dacă sigla dvs. este ascunsă..", + "Cart description": "Descrierea coșului", + "This description shows when your website is listed in search engine results.": "Această descriere arată când site-ul dvs. web este listat în rezultatele motorului de căutare.", + "Cart image/logo": "Imagine coș / logo", + "Cart URL": "Adresă URL coș", + "This URL is used in sitemaps and when your customer returns from completing their payment.": "Această adresă URL este utilizată în sitemapuri și atunci când clientul dvs. se întoarce după finalizarea plății.", + "This is used as the \"from\" email when sending receipts to your customers.": "Aceasta este utilizată ca e-mail \\\" din \\ \"la trimiterea de chitanțe către clienții dvs.", + "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Comenzile peste această valoare vor însemna că livrarea va fi GRATUITă. Setați la valoare ridicată dacă vreți să încărcați întotdeauna livrare.", + "Payment gateway": "Gateway de plată", + "Payment_Gateway_Info": "De asemenea, va trebui să vă configurați acreditările gateway-ului de plată în fișierul` / config / .json`..", + "Currency symbol": "Simbol valutar", + "Set this to your currency symbol. Eg: $, £, €": "Setați acest simbol la moneda dvs. De exemplu: $, £, €", + "Theme": "Tema", + "Theme_Info": "Temele sunt încărcate din` /views/themes/`", + "Products per row": "Produse pe rând", + "The number of products to be displayed across the page.": "Numărul de produse care trebuie afișate pe toată pagina.", + "Products per page": "Produse pe pagină", + "The number of products to be displayed on each page.": "Numărul de produse care trebuie afișate pe fiecare pagină.", + "Menu Enabled": "Menu Enabled", + "Menu_Enabled_Info": "Dacă este setat un meniu, îl puteți configura aici .", + "Menu header": "Antet meniu", + "The heading text for your menu.": "Textul antetului pentru meniul dvs.", + "Menu location": "Locația meniu", + "The location of your menu.": "Locația meniului dvs.", + "Google_Analytics_Info": "Codul dvs. Google Analytics. Includeți și etichetele \" script \"- Ajutor ", + "Custom CSS": "CSS personalizat", + "Send test email": "Trimiteți e-mailul de testare", + "Users name": "Numele utilizatorilor", + "User email": "Email utilizator", + "Password confirm": "Confirmare parolă", + "User password": "Parola de utilizator", + "Complete setup": "Configurare completă", + "User is admin?": "Utilizatorul este administrator?", + "Generate": "Generați", + "New User": "Utilizator nou", + "Create": "Create", + "Role": "Rol", + "User": "Utilizator", + "No products found": "Nu au fost găsite produse", + "Category": "Categorie", + "Search results": "Rezultate căutare", + "Add to cart": "Adauga in cos", + "Pay now": "Plătește acum", + "Customer details": "Detalii client", + "Existing customer": "Client existent", + "Forgotten": "Uitat", + "Change customer": "Schimbă client", + "Enter a password to create an account for next time": "Introduceți o parolă pentru a crea un cont pentru data viitoare", + "Create account": "Creați un cont", + "Your payment has been successfully processed": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", + "Your payment has failed. Please try again or contact us.": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", + "Please retain the details above as a reference of payment.": "Vă rugăm să păstrați detaliile de mai sus ca referință de plată.", + "Quantity": "Cantitate", + "Leave a comment?": "Lasă un comentariu?", + "Cart contents": "Conținutul coșului", + "Shipping": "Expediere:", + "Empty cart": "Coș gol", + "List": "Listă", + "Order type": "Tipul comenzii", + "New user": "Utilizator nou", + "Payment ID": "ID de plată", + "Payment Message": "Mesaj de plată", + "Password": "Parolă", + "Cart Email": "E-mail coș", + "Information": "Informații", + "Shipping options": "Opțiuni de expediere", + "Proceed to payment": "Treceți la plată", + "Return to information": "Reveniți la informații", + "Search shop": "Căutare magazin", + "Dashboard": "Tablou de bord", + "Create order": "Creați o comandă", + "Order shipping amount": "Suma de expediere a comenzii", + "Order net amount": "Suma netă a comenzii", + "Discount code": "Cod de reducere", + "Apply": "Aplică", + "Discount codes": "Coduri de reducere", + "Code": "Cod", + "Expiry": "Expirare", + "There are currently no discount codes setup.": "În prezent nu există configurarea codurilor de reducere.", + "New discount": "Reducere nouă", + "Amount": "Suma", + "Percent": "Procent", + "Discount type": "Tip de reducere", + "Discount value": "Valoarea reducerii", + "Discount": "Reducere", + "Edit discount": "Editați reducerea", + "New Discount": "Reducere nouă", + "Discount start": "Discount discount", + "Discount end": "Sfârșit de reducere", + "Start": "începe", + "Running": "Rulează", + "Not running": "Nu rulează", + "Menu": "Meniu", + "Users": "Utilizatori", + "Create Order": "Creați o comandă", + "User edit": "Modificarea utilizatorului", + "Blockonomics payment details": "Detaliile de plată Blockonomics", + "Order Expected BTC": "Order Expected BTC", + "Order Received BTC": "Order Received BTC", + "Order Blockonomics Txid": "Comanda Blockonomics Txid", + "Currency ISO": "Valută ISO", + "Currency used for Blockonomics conversion": "Monedă utilizată pentru conversia Blockonomics", + "Logout": "Deconectare", + "Company": "Companie", + "View": "Vizualizare", + "Related products": "Produse conexe", + "Disable stock tracking": "Dezactivează urmărirea stocului", + "Company name": "Nume companie", + "Product variants": "Variante de produs", + "Shown in the variant dropdown": "Afișat în varianta drop-down", + "Here you can set variants for your product. Eg: Size, color, style": "Aici puteți seta variante pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", + "Product Order By": "Comanda produsului după", + "Date": "Data", + "Title": "Title", + "Select the field by which the product should be sorted when displayed in store.": "Selectați câmpul după care produsul trebuie sortat atunci când este afișat în magazin.", + "Product Order": "Comandă produs", + "Descending": "Descendent", + "Ascending": "Ascendent", + "Select the order in which the products should be sorted.": "Selectați ordinea în care trebuie sortate produsele.", + "Recent reviews": "Recenzii recente", + "Reviews can be filtered by: review title or review description keywords": "Recenziile pot fi filtrate după: titlul recenziei sau cuvintele cheie cu descrierea recenziei", + "Reviews": "Recenzii", + "Product GTIN": "Produs GTIN", + "The Serial number, GTIN or Barcode": "Numărul de serie, GTIN sau cod de bare", + "Product Brand": "Marca produsului", + "The brand of the product": "Marca produsului", + "Cart Empty": "Coș gol", + "Estimated shipping": "Transport estimat", + "Please enter a valid email address": "Vă rugăm să introduceți o adresă de e-mail validă", + "Address 2 (optional)": "Adresa 2 (opțional)", + "Select Country": "Selectare țară", + "Post code": "Cod poștal", + "Cancel": "Cancel", + "Add review": "Adaugă recenzie", + "Product review": "Revizuirea produsului", + "Love it": "Iubește-l", + "Description": "Descriere", + "Product is great. Does everything it said it can do.": "Produsul este grozav. Face tot ce a spus că poate face.", + "Rating": "Rating" } diff --git a/views/order-create.hbs b/views/order-create.hbs index 30d6996c..4e39c0fd 100644 --- a/views/order-create.hbs +++ b/views/order-create.hbs @@ -10,7 +10,7 @@
- +
- +
@@ -35,7 +35,7 @@
- +
@@ -46,13 +46,13 @@
- +
- +
@@ -66,7 +66,7 @@
- - + +
- - + +
- +
- \ No newline at end of file + diff --git a/views/themes/Cloth/cart.hbs b/views/themes/Cloth/cart.hbs index 686032cc..42f47459 100644 --- a/views/themes/Cloth/cart.hbs +++ b/views/themes/Cloth/cart.hbs @@ -10,7 +10,7 @@ {{#if productImage}} {{this.title}} product image {{else}} - {{this.title}} product image + {{this.title}} product image {{/if}}
@@ -27,11 +27,11 @@
-
@@ -82,10 +82,10 @@ {{else}}
- Cart empty +

{{ @root.__ "Cart Empty" }}

{{/if}}
- \ No newline at end of file + diff --git a/views/themes/Cloth/checkout-cart.hbs b/views/themes/Cloth/checkout-cart.hbs index 5169153d..8d2ee75c 100644 --- a/views/themes/Cloth/checkout-cart.hbs +++ b/views/themes/Cloth/checkout-cart.hbs @@ -5,9 +5,9 @@
- Checkout + {{ @root.__ "Checkout" }}
- \ No newline at end of file + diff --git a/views/themes/Cloth/checkout-information.hbs b/views/themes/Cloth/checkout-information.hbs index 21125c2a..468631c0 100644 --- a/views/themes/Cloth/checkout-information.hbs +++ b/views/themes/Cloth/checkout-information.hbs @@ -1,14 +1,14 @@
@@ -70,14 +70,14 @@
{{/unless}}
@@ -95,4 +95,4 @@ - \ No newline at end of file + diff --git a/views/themes/Cloth/shipping-form.hbs b/views/themes/Cloth/shipping-form.hbs index d5ae16c6..9cc9db77 100644 --- a/views/themes/Cloth/shipping-form.hbs +++ b/views/themes/Cloth/shipping-form.hbs @@ -1,41 +1,41 @@
- +
- Please enter a valid email address + {{@root.__ "Please enter a valid email address"}}
- +
- +
- +
- +
- +
+
- +
- +
- +
-
\ No newline at end of file + From f19270e7430e14f2630f5b0ea87279323ab9db06 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 27 Aug 2021 16:12:21 +0300 Subject: [PATCH 16/79] fixed a lot of missing I18N fixed strings Signed-off-by: nick --- config/settings.json | 9 +- lib/modules/shipping-basic.js | 8 +- locales/en.json | 16 +- locales/ro.json | 469 ++++++++++---------- views/order-create.hbs | 22 +- views/partials/reviewModal.hbs | 18 +- views/themes/Cloth/cart.hbs | 14 +- views/themes/Cloth/checkout-cart.hbs | 4 +- views/themes/Cloth/checkout-information.hbs | 20 +- views/themes/Cloth/shipping-form.hbs | 26 +- 10 files changed, 317 insertions(+), 289 deletions(-) diff --git a/config/settings.json b/config/settings.json index c3cfc862..c9b23578 100644 --- a/config/settings.json +++ b/config/settings.json @@ -18,7 +18,7 @@ "currencySymbol": "£", "currencyISO": "USD", "paymentGateway": [ - "stripe" + "stripe" ], "databaseConnectionString": "mongodb://127.0.0.1:27017/expresscart", "theme": "Cloth", @@ -26,9 +26,10 @@ "orderHook": "", "availableLanguages": [ "en", - "it" + "it", + "ro" ], - "defaultLocale": "en", + "defaultLocale": "ro", "maxQuantity": 25, "twitterHandle": "", "facebookAppId": "", @@ -48,4 +49,4 @@ }, "showRelatedProducts": true, "showHomepageVariants": false -} \ No newline at end of file +} diff --git a/lib/modules/shipping-basic.js b/lib/modules/shipping-basic.js index db3e589f..d894e379 100644 --- a/lib/modules/shipping-basic.js +++ b/lib/modules/shipping-basic.js @@ -5,7 +5,7 @@ const shippingFromCountry = 'Australia'; const calculateShipping = (amount, config, req) => { if(amount >= freeThreshold){ - req.session.shippingMessage = 'FREE shipping'; + req.session.shippingMessage = req.__('FREE shipping'); req.session.totalCartShipping = 0; req.session.totalCartAmount = req.session.totalCartAmount + 0; return; @@ -13,7 +13,7 @@ const calculateShipping = (amount, config, req) => { // If there is no country set, we estimate shipping if(!req.session.customerCountry){ - req.session.shippingMessage = 'Estimated shipping'; + req.session.shippingMessage = req.__('Estimated shipping'); req.session.totalCartShipping = domesticShippingAmount; req.session.totalCartAmount = amount + domesticShippingAmount; return; @@ -21,14 +21,14 @@ const calculateShipping = (amount, config, req) => { // Check for international if(req.session.customerCountry.toLowerCase() !== shippingFromCountry.toLowerCase()){ - req.session.shippingMessage = 'International shipping'; + req.session.shippingMessage = req.__('International shipping'); req.session.totalCartShipping = internationalShippingAmount; req.session.totalCartAmount = amount + internationalShippingAmount; return; } // Domestic shipping - req.session.shippingMessage = 'Domestic shipping'; + req.session.shippingMessage = req.__('Domestic shipping'); req.session.totalCartShipping = domesticShippingAmount; req.session.totalCartAmount = amount + domesticShippingAmount; }; diff --git a/locales/en.json b/locales/en.json index 2991b03b..f28a0c7a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -226,5 +226,19 @@ "Product GTIN": "Product GTIN", "The Serial number, GTIN or Barcode": "The Serial number, GTIN or Barcode", "Product Brand": "Product Brand", - "The brand of the product": "The brand of the product" + "The brand of the product": "The brand of the product", + "Cart Empty": "Cart Empty", + "Estimated shipping": "Estimated shipping", + "Please enter a valid email address": "Please enter a valid email address", + "Address 2 (optional)": "Address 2 (optional)", + "Select Country": "Select Country", + "Post code": "Post code", + "Cancel": "Cancel", + "Add review": "Add review", + "Product review": "Product review", + "Love it": "Love it", + "Description": "Description", + "Product is great. Does everything it said it can do.": "Product is great. Does everything it said it can do.", + "Rating": "Rating" + } diff --git a/locales/ro.json b/locales/ro.json index 8afba403..3b1d9888 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -1,230 +1,243 @@ { - "Languages": "Languages", - "en": "Engleză", - "it": "Italiană", - "ro": "Română", - "Cart": "Coș", - "Name": "Nume", - "New": "Nou", - "Settings": "Setări", - "General settings": "Setări generale", - "Address 1": "Adresa 1", - "Address 2": "Adresa 2", - "Country": "Țară", - "State": "Județ", - "Postcode": "Cod poștal", - "Phone number": "Număr de telefon", - "Creation date": "Data creației", - "Customers can be filtered by: email, name or phone number": "Clienții pot fi filtrați după: e-mail, nume sau număr de telefon", - "Customers": "Clienți", - "Filtered term": "Termen filtrat", - "No orders found": "Nu s-au găsit comenzi", - "Email address": "Adresa de e-mail", - "Please enter your email address": "Vă rugăm să introduceți adresa de e-mail", - "Reset": "Reset", - "Please sign in": "Vă rugăm să vă conectați", - "Sign in": "Conectați-vă", - "Update status": "Actualizați starea", - "Go Back": "Du-te înapoi", - "Order date": "Data comenzii", - "Order ID": "ID-ul comenzii", - "Payment Gateway ref": "Payment Gateway ref", - "Payment Gateway": "Payment Gateway", - "Order total amount": "Suma totală a comenzii", - "First name": "Prenume", - "Last name": "Numele de familie", - "Order comment": "Comandă comentariu", - "Products ordered": "Produse comandate", - "Options": "Opțiuni", - "Filter": "Filter", - "By status": "După statut", - "Orders can be filtered by: surname, email address or postcode/zipcode": "Comenzile pot fi filtrate după: prenume, adresă de e-mail sau cod poștal / cod poștal", - "Completed": "Finalizat", - "Paid": "Plătit", - "Created": "Creat", - "Cancelled": "Anulat", - "Declined": "Declinat", - "Shipped": "Expediat", - "Pending": "În așteptare", - "Orders": "Comenzi", - "Recent orders": "Comenzi recente", - "Status": "Status", - "Upload image": "Încarcă imaginea", - "Save product": "Salvați produsul", - "Edit product": "Editați produsul", - "Product title": "Titlul produsului", - "Product price": "Preț produs", - "Published": "Publicat", - "Draft": "Proiect", - "Stock level": "Nivel stoc", - "Product description": "Descrierea produsului", - "Validate": "Validați", - "This sets a readable URL for the product": "Aceasta setează o adresă URL lizibilă pentru produs", - "Product options": "Opțiuni produs", - "Label": "Label", - "Type": "Type", - "Add": "Adăugați", - "Remove": "Șterge", - "Here you can set options for your product. Eg: Size, color, style": "Aici puteți seta opțiuni pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", - "Allow comment": "Permiteți comentariul", - "Allow free form comments when adding products to cart": "Permiteți comentarii gratuite de formular atunci când adăugați produse în coș", - "Product tag words": "Cuvinte etichetă produs", - "Tag words used to indexed products, making them easier to find and filter.": "Etichetați cuvintele folosite la produsele indexate, făcându-le mai ușor de găsit și filtrat.", - "Product images": "Imagini de produs", - "Delete": "Șterge", - "main image": "imaginea principală", - "Set as main image": "Setați ca imagine principală", - "No images have been uploaded for this product": "Nu au fost încărcate imagini pentru acest produs", - "Product image upload": "Încărcare imagine produs", - "Select file": "Selectează fișierul", - "Upload": "Încărcare", - "New product": "Produs nou", - "Products can be filtered by: product title or product description keywords": "Produsele pot fi filtrate după: titlul produsului sau cuvintele cheie cu descrierea produsului", - "Products": "Produse", - "Recent products": "Produse recente", - "Confirm": "Confirmă", - "Update": "Actualizare", - "Setting_menu_explain": "ici puteți configura un meniu afișat în coșul dvs. de cumpărături. Puteți utiliza acest meniu pentru a filtra produsele dvs. specificând un cuvânt cheie în câmpul \\\" link \\ \". De exemplu: pentru a afișa produse cu un cuvânt cheie (sau etichetă) de cizme, ați seta câmpul de meniu la \\ \"Rucsacuri \\\" și o valoare a legăturii \\ \"rucsac \\\". De asemenea, puteți utiliza acest meniu pentru a vă conecta la pagini statice, de exemplu: expediere, returnări, ajutor, despre, contact etc. . \"", - "Static page": "Pagină statică", - "Page name": "Numele paginii", - "A friendly name to manage the static page.": "Un nume prietenos pentru a gestiona pagina statică.", - "Page slug": "Page slug", - "Page_Slug_Description": "TAceasta este adresa URL relativă a paginii. De exemplu: o setare de \\\" despre \\ \"ar face pagina disponibilă la: mydomain.com/about", - "Page Enabled": "Page Enabled", - "Page content": "Conținutul paginii", - "Here you can enter the content you wish to be displayed on your static page.": "Aici puteți introduce conținutul pe care doriți să îl afișați pe pagina dvs. statică.", - "New page": "Pagină nouă", - "Static pages": "Pagini statice", - "Static_Pages_Info": "Aici puteți configura și gestiona pagini statice pentru coșul dvs. de cumpărături. Poate doriți să configurați o pagină cu un pic despre afacerea dvs. numită \\\" Despre \\ \"sau \\\" Contactați-ne \\ \"etc.", - "Edit": "Editează", - "There are currently no static pages setup. Please setup a static page.": "În prezent nu există configurarea paginilor statice. Vă rugăm să configurați o pagină statică.", - "Create new": "Creați un nou", - "Search": "Căutare", - "Cart name": "Numele coșului", - "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "Acest element este esențial pentru optimizarea motorului de căutare. Ca rt title este afișat dacă sigla dvs. este ascunsă..", - "Cart description": "Descrierea coșului", - "This description shows when your website is listed in search engine results.": "Această descriere arată când site-ul dvs. web este listat în rezultatele motorului de căutare.", - "Cart image/logo": "Imagine coș / logo", - "Cart URL": "Adresă URL coș", - "This URL is used in sitemaps and when your customer returns from completing their payment.": "Această adresă URL este utilizată în sitemapuri și atunci când clientul dvs. se întoarce după finalizarea plății.", - "This is used as the \"from\" email when sending receipts to your customers.": "Aceasta este utilizată ca e-mail \\\" din \\ \"la trimiterea de chitanțe către clienții dvs.", - "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Comenzile peste această valoare vor însemna că livrarea va fi GRATUITă. Setați la valoare ridicată dacă vreți să încărcați întotdeauna livrare.", - "Payment gateway": "Gateway de plată", - "Payment_Gateway_Info": "De asemenea, va trebui să vă configurați acreditările gateway-ului de plată în fișierul` / config / .json`..", - "Currency symbol": "Simbol valutar", - "Set this to your currency symbol. Eg: $, £, €": "Setați acest simbol la moneda dvs. De exemplu: $, £, €", - "Theme": "Tema", - "Theme_Info": "Temele sunt încărcate din` /views/themes/`", - "Products per row": "Produse pe rând", - "The number of products to be displayed across the page.": "Numărul de produse care trebuie afișate pe toată pagina.", - "Products per page": "Produse pe pagină", - "The number of products to be displayed on each page.": "Numărul de produse care trebuie afișate pe fiecare pagină.", - "Menu Enabled": "Menu Enabled", - "Menu_Enabled_Info": "Dacă este setat un meniu, îl puteți configura aici .", - "Menu header": "Antet meniu", - "The heading text for your menu.": "Textul antetului pentru meniul dvs.", - "Menu location": "Locația meniu", - "The location of your menu.": "Locația meniului dvs.", - "Google_Analytics_Info": "Codul dvs. Google Analytics. Includeți și etichetele \" script \"- Ajutor ", - "Custom CSS": "CSS personalizat", - "Send test email": "Trimiteți e-mailul de testare", - "Users name": "Numele utilizatorilor", - "User email": "Email utilizator", - "Password confirm": "Confirmare parolă", - "User password": "Parola de utilizator", - "Complete setup": "Configurare completă", - "User is admin?": "Utilizatorul este administrator?", - "Generate": "Generați", - "New User": "Utilizator nou", - "Create": "Create", - "Role": "Rol", - "User": "Utilizator", - "No products found": "Nu au fost găsite produse", - "Category": "Categorie", - "Search results": "Rezultate căutare", - "Add to cart": "Adauga in cos", - "Pay now": "Plătește acum", - "Customer details": "Detalii client", - "Existing customer": "Client existent", - "Forgotten": "Uitat", - "Change customer": "Schimbă client", - "Enter a password to create an account for next time": "Introduceți o parolă pentru a crea un cont pentru data viitoare", - "Create account": "Creați un cont", - "Your payment has been successfully processed": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", - "Your payment has failed. Please try again or contact us.": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", - "Please retain the details above as a reference of payment.": "Vă rugăm să păstrați detaliile de mai sus ca referință de plată.", - "Quantity": "Cantitate", - "Leave a comment?": "Lasă un comentariu?", - "Cart contents": "Conținutul coșului", - "Shipping": "Expediere:", - "Empty cart": "Coș gol", - "List": "Listă", - "Order type": "Tipul comenzii", - "New user": "Utilizator nou", - "Payment ID": "ID de plată", - "Payment Message": "Mesaj de plată", - "Password": "Parolă", - "Cart Email": "E-mail coș", - "Information": "Informații", - "Shipping options": "Opțiuni de expediere", - "Proceed to payment": "Treceți la plată", - "Return to information": "Reveniți la informații", - "Search shop": "Căutare magazin", - "Dashboard": "Tablou de bord", - "Create order": "Creați o comandă", - "Order shipping amount": "Suma de expediere a comenzii", - "Order net amount": "Suma netă a comenzii", - "Discount code": "Cod de reducere", - "Apply": "Aplică", - "Discount codes": "Coduri de reducere", - "Code": "Cod", - "Expiry": "Expirare", - "There are currently no discount codes setup.": "În prezent nu există configurarea codurilor de reducere.", - "New discount": "Reducere nouă", - "Amount": "Suma", - "Percent": "Procent", - "Discount type": "Tip de reducere", - "Discount value": "Valoarea reducerii", - "Discount": "Reducere", - "Edit discount": "Editați reducerea", - "New Discount": "Reducere nouă", - "Discount start": "Discount discount", - "Discount end": "Sfârșit de reducere", - "Start": "începe", - "Running": "Rulează", - "Not running": "Nu rulează", - "Menu": "Meniu", - "Users": "Utilizatori", - "Create Order": "Creați o comandă", - "User edit": "Modificarea utilizatorului", - "Blockonomics payment details": "Detaliile de plată Blockonomics", - "Order Expected BTC": "Order Expected BTC", - "Order Received BTC": "Order Received BTC", - "Order Blockonomics Txid": "Comanda Blockonomics Txid", - "Currency ISO": "Valută ISO", - "Currency used for Blockonomics conversion": "Monedă utilizată pentru conversia Blockonomics", - "Logout": "Deconectare", - "Company": "Companie", - "View": "Vizualizare", - "Related products": "Produse conexe", - "Disable stock tracking": "Dezactivează urmărirea stocului", - "Company name": "Nume companie", - "Product variants": "Variante de produs", - "Shown in the variant dropdown": "Afișat în varianta drop-down", - "Here you can set variants for your product. Eg: Size, color, style": "Aici puteți seta variante pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", - "Product Order By": "Comanda produsului după", - "Date": "Data", - "Title": "Title", - "Select the field by which the product should be sorted when displayed in store.": "Selectați câmpul după care produsul trebuie sortat atunci când este afișat în magazin.", - "Product Order": "Comandă produs", - "Descending": "Descendent", - "Ascending": "Ascendent", - "Select the order in which the products should be sorted.": "Selectați ordinea în care trebuie sortate produsele.", - "Recent reviews": "Recenzii recente", - "Reviews can be filtered by: review title or review description keywords": "Recenziile pot fi filtrate după: titlul recenziei sau cuvintele cheie cu descrierea recenziei", - "Reviews": "Recenzii", - "Product GTIN": "Produs GTIN", - "The Serial number, GTIN or Barcode": "Numărul de serie, GTIN sau cod de bare", - "Product Brand": "Marca produsului", - "The brand of the product": "Marca produsului" + "Languages": "Languages", + "en": "Engleză", + "it": "Italiană", + "ro": "Română", + "Cart": "Coș", + "Name": "Nume", + "New": "Nou", + "Settings": "Setări", + "General settings": "Setări generale", + "Address 1": "Adresa 1", + "Address 2": "Adresa 2", + "Country": "Țară", + "State": "Județ", + "Postcode": "Cod poștal", + "Phone number": "Număr de telefon", + "Creation date": "Data creației", + "Customers can be filtered by: email, name or phone number": "Clienții pot fi filtrați după: e-mail, nume sau număr de telefon", + "Customers": "Clienți", + "Filtered term": "Termen filtrat", + "No orders found": "Nu s-au găsit comenzi", + "Email address": "Adresa de e-mail", + "Please enter your email address": "Vă rugăm să introduceți adresa de e-mail", + "Reset": "Reset", + "Please sign in": "Vă rugăm să vă conectați", + "Sign in": "Conectați-vă", + "Update status": "Actualizați starea", + "Go Back": "Du-te înapoi", + "Order date": "Data comenzii", + "Order ID": "ID-ul comenzii", + "Payment Gateway ref": "Payment Gateway ref", + "Payment Gateway": "Payment Gateway", + "Order total amount": "Suma totală a comenzii", + "First name": "Prenume", + "Last name": "Numele de familie", + "Order comment": "Comandă comentariu", + "Products ordered": "Produse comandate", + "Options": "Opțiuni", + "Filter": "Filter", + "By status": "După statut", + "Orders can be filtered by: surname, email address or postcode/zipcode": "Comenzile pot fi filtrate după: prenume, adresă de e-mail sau cod poștal / cod poștal", + "Completed": "Finalizat", + "Paid": "Plătit", + "Created": "Creat", + "Cancelled": "Anulat", + "Declined": "Declinat", + "Shipped": "Expediat", + "Pending": "În așteptare", + "Orders": "Comenzi", + "Recent orders": "Comenzi recente", + "Status": "Status", + "Upload image": "Încarcă imaginea", + "Save product": "Salvați produsul", + "Edit product": "Editați produsul", + "Product title": "Titlul produsului", + "Product price": "Preț produs", + "Published": "Publicat", + "Draft": "Proiect", + "Stock level": "Nivel stoc", + "Product description": "Descrierea produsului", + "Validate": "Validați", + "This sets a readable URL for the product": "Aceasta setează o adresă URL lizibilă pentru produs", + "Product options": "Opțiuni produs", + "Label": "Label", + "Type": "Type", + "Add": "Adăugați", + "Remove": "Șterge", + "Here you can set options for your product. Eg: Size, color, style": "Aici puteți seta opțiuni pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", + "Allow comment": "Permiteți comentariul", + "Allow free form comments when adding products to cart": "Permiteți comentarii gratuite de formular atunci când adăugați produse în coș", + "Product tag words": "Cuvinte etichetă produs", + "Tag words used to indexed products, making them easier to find and filter.": "Etichetați cuvintele folosite la produsele indexate, făcându-le mai ușor de găsit și filtrat.", + "Product images": "Imagini de produs", + "Delete": "Șterge", + "main image": "imaginea principală", + "Set as main image": "Setați ca imagine principală", + "No images have been uploaded for this product": "Nu au fost încărcate imagini pentru acest produs", + "Product image upload": "Încărcare imagine produs", + "Select file": "Selectează fișierul", + "Upload": "Încărcare", + "New product": "Produs nou", + "Products can be filtered by: product title or product description keywords": "Produsele pot fi filtrate după: titlul produsului sau cuvintele cheie cu descrierea produsului", + "Products": "Produse", + "Recent products": "Produse recente", + "Confirm": "Confirmă", + "Update": "Actualizare", + "Setting_menu_explain": "ici puteți configura un meniu afișat în coșul dvs. de cumpărături. Puteți utiliza acest meniu pentru a filtra produsele dvs. specificând un cuvânt cheie în câmpul \\\" link \\ \". De exemplu: pentru a afișa produse cu un cuvânt cheie (sau etichetă) de cizme, ați seta câmpul de meniu la \\ \"Rucsacuri \\\" și o valoare a legăturii \\ \"rucsac \\\". De asemenea, puteți utiliza acest meniu pentru a vă conecta la pagini statice, de exemplu: expediere, returnări, ajutor, despre, contact etc. . \"", + "Static page": "Pagină statică", + "Page name": "Numele paginii", + "A friendly name to manage the static page.": "Un nume prietenos pentru a gestiona pagina statică.", + "Page slug": "Page slug", + "Page_Slug_Description": "TAceasta este adresa URL relativă a paginii. De exemplu: o setare de \\\" despre \\ \"ar face pagina disponibilă la: mydomain.com/about", + "Page Enabled": "Page Enabled", + "Page content": "Conținutul paginii", + "Here you can enter the content you wish to be displayed on your static page.": "Aici puteți introduce conținutul pe care doriți să îl afișați pe pagina dvs. statică.", + "New page": "Pagină nouă", + "Static pages": "Pagini statice", + "Static_Pages_Info": "Aici puteți configura și gestiona pagini statice pentru coșul dvs. de cumpărături. Poate doriți să configurați o pagină cu un pic despre afacerea dvs. numită \\\" Despre \\ \"sau \\\" Contactați-ne \\ \"etc.", + "Edit": "Editează", + "There are currently no static pages setup. Please setup a static page.": "În prezent nu există configurarea paginilor statice. Vă rugăm să configurați o pagină statică.", + "Create new": "Creați un nou", + "Search": "Căutare", + "Cart name": "Numele coșului", + "This element is critical for search engine optimisation. Cart title is displayed if your logo is hidden.": "Acest element este esențial pentru optimizarea motorului de căutare. Ca rt title este afișat dacă sigla dvs. este ascunsă..", + "Cart description": "Descrierea coșului", + "This description shows when your website is listed in search engine results.": "Această descriere arată când site-ul dvs. web este listat în rezultatele motorului de căutare.", + "Cart image/logo": "Imagine coș / logo", + "Cart URL": "Adresă URL coș", + "This URL is used in sitemaps and when your customer returns from completing their payment.": "Această adresă URL este utilizată în sitemapuri și atunci când clientul dvs. se întoarce după finalizarea plății.", + "This is used as the \"from\" email when sending receipts to your customers.": "Aceasta este utilizată ca e-mail \\\" din \\ \"la trimiterea de chitanțe către clienții dvs.", + "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Comenzile peste această valoare vor însemna că livrarea va fi GRATUITă. Setați la valoare ridicată dacă vreți să încărcați întotdeauna livrare.", + "Payment gateway": "Gateway de plată", + "Payment_Gateway_Info": "De asemenea, va trebui să vă configurați acreditările gateway-ului de plată în fișierul` / config / .json`..", + "Currency symbol": "Simbol valutar", + "Set this to your currency symbol. Eg: $, £, €": "Setați acest simbol la moneda dvs. De exemplu: $, £, €", + "Theme": "Tema", + "Theme_Info": "Temele sunt încărcate din` /views/themes/`", + "Products per row": "Produse pe rând", + "The number of products to be displayed across the page.": "Numărul de produse care trebuie afișate pe toată pagina.", + "Products per page": "Produse pe pagină", + "The number of products to be displayed on each page.": "Numărul de produse care trebuie afișate pe fiecare pagină.", + "Menu Enabled": "Menu Enabled", + "Menu_Enabled_Info": "Dacă este setat un meniu, îl puteți configura aici .", + "Menu header": "Antet meniu", + "The heading text for your menu.": "Textul antetului pentru meniul dvs.", + "Menu location": "Locația meniu", + "The location of your menu.": "Locația meniului dvs.", + "Google_Analytics_Info": "Codul dvs. Google Analytics. Includeți și etichetele \" script \"- Ajutor ", + "Custom CSS": "CSS personalizat", + "Send test email": "Trimiteți e-mailul de testare", + "Users name": "Numele utilizatorilor", + "User email": "Email utilizator", + "Password confirm": "Confirmare parolă", + "User password": "Parola de utilizator", + "Complete setup": "Configurare completă", + "User is admin?": "Utilizatorul este administrator?", + "Generate": "Generați", + "New User": "Utilizator nou", + "Create": "Create", + "Role": "Rol", + "User": "Utilizator", + "No products found": "Nu au fost găsite produse", + "Category": "Categorie", + "Search results": "Rezultate căutare", + "Add to cart": "Adauga in cos", + "Pay now": "Plătește acum", + "Customer details": "Detalii client", + "Existing customer": "Client existent", + "Forgotten": "Uitat", + "Change customer": "Schimbă client", + "Enter a password to create an account for next time": "Introduceți o parolă pentru a crea un cont pentru data viitoare", + "Create account": "Creați un cont", + "Your payment has been successfully processed": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", + "Your payment has failed. Please try again or contact us.": "Plata dvs. a eșuat. Încercați din nou sau contactați-ne.", + "Please retain the details above as a reference of payment.": "Vă rugăm să păstrați detaliile de mai sus ca referință de plată.", + "Quantity": "Cantitate", + "Leave a comment?": "Lasă un comentariu?", + "Cart contents": "Conținutul coșului", + "Shipping": "Expediere:", + "Empty cart": "Coș gol", + "List": "Listă", + "Order type": "Tipul comenzii", + "New user": "Utilizator nou", + "Payment ID": "ID de plată", + "Payment Message": "Mesaj de plată", + "Password": "Parolă", + "Cart Email": "E-mail coș", + "Information": "Informații", + "Shipping options": "Opțiuni de expediere", + "Proceed to payment": "Treceți la plată", + "Return to information": "Reveniți la informații", + "Search shop": "Căutare magazin", + "Dashboard": "Tablou de bord", + "Create order": "Creați o comandă", + "Order shipping amount": "Suma de expediere a comenzii", + "Order net amount": "Suma netă a comenzii", + "Discount code": "Cod de reducere", + "Apply": "Aplică", + "Discount codes": "Coduri de reducere", + "Code": "Cod", + "Expiry": "Expirare", + "There are currently no discount codes setup.": "În prezent nu există configurarea codurilor de reducere.", + "New discount": "Reducere nouă", + "Amount": "Suma", + "Percent": "Procent", + "Discount type": "Tip de reducere", + "Discount value": "Valoarea reducerii", + "Discount": "Reducere", + "Edit discount": "Editați reducerea", + "New Discount": "Reducere nouă", + "Discount start": "Discount discount", + "Discount end": "Sfârșit de reducere", + "Start": "începe", + "Running": "Rulează", + "Not running": "Nu rulează", + "Menu": "Meniu", + "Users": "Utilizatori", + "Create Order": "Creați o comandă", + "User edit": "Modificarea utilizatorului", + "Blockonomics payment details": "Detaliile de plată Blockonomics", + "Order Expected BTC": "Order Expected BTC", + "Order Received BTC": "Order Received BTC", + "Order Blockonomics Txid": "Comanda Blockonomics Txid", + "Currency ISO": "Valută ISO", + "Currency used for Blockonomics conversion": "Monedă utilizată pentru conversia Blockonomics", + "Logout": "Deconectare", + "Company": "Companie", + "View": "Vizualizare", + "Related products": "Produse conexe", + "Disable stock tracking": "Dezactivează urmărirea stocului", + "Company name": "Nume companie", + "Product variants": "Variante de produs", + "Shown in the variant dropdown": "Afișat în varianta drop-down", + "Here you can set variants for your product. Eg: Size, color, style": "Aici puteți seta variante pentru produsul dvs. De exemplu: Dimensiune, culoare, stil", + "Product Order By": "Comanda produsului după", + "Date": "Data", + "Title": "Title", + "Select the field by which the product should be sorted when displayed in store.": "Selectați câmpul după care produsul trebuie sortat atunci când este afișat în magazin.", + "Product Order": "Comandă produs", + "Descending": "Descendent", + "Ascending": "Ascendent", + "Select the order in which the products should be sorted.": "Selectați ordinea în care trebuie sortate produsele.", + "Recent reviews": "Recenzii recente", + "Reviews can be filtered by: review title or review description keywords": "Recenziile pot fi filtrate după: titlul recenziei sau cuvintele cheie cu descrierea recenziei", + "Reviews": "Recenzii", + "Product GTIN": "Produs GTIN", + "The Serial number, GTIN or Barcode": "Numărul de serie, GTIN sau cod de bare", + "Product Brand": "Marca produsului", + "The brand of the product": "Marca produsului", + "Cart Empty": "Coș gol", + "Estimated shipping": "Transport estimat", + "Please enter a valid email address": "Vă rugăm să introduceți o adresă de e-mail validă", + "Address 2 (optional)": "Adresa 2 (opțional)", + "Select Country": "Selectare țară", + "Post code": "Cod poștal", + "Cancel": "Cancel", + "Add review": "Adaugă recenzie", + "Product review": "Revizuirea produsului", + "Love it": "Iubește-l", + "Description": "Descriere", + "Product is great. Does everything it said it can do.": "Produsul este grozav. Face tot ce a spus că poate face.", + "Rating": "Rating" } diff --git a/views/order-create.hbs b/views/order-create.hbs index 30d6996c..4e39c0fd 100644 --- a/views/order-create.hbs +++ b/views/order-create.hbs @@ -10,7 +10,7 @@
- +
- +
@@ -35,7 +35,7 @@
- +
@@ -46,13 +46,13 @@
- +
- +
@@ -66,7 +66,7 @@
- - + +
- - + +
- +
- \ No newline at end of file + diff --git a/views/themes/Cloth/cart.hbs b/views/themes/Cloth/cart.hbs index 686032cc..42f47459 100644 --- a/views/themes/Cloth/cart.hbs +++ b/views/themes/Cloth/cart.hbs @@ -10,7 +10,7 @@ {{#if productImage}} {{this.title}} product image {{else}} - {{this.title}} product image + {{this.title}} product image {{/if}}
@@ -27,11 +27,11 @@
-
@@ -82,10 +82,10 @@ {{else}}
- Cart empty +

{{ @root.__ "Cart Empty" }}

{{/if}}
- \ No newline at end of file + diff --git a/views/themes/Cloth/checkout-cart.hbs b/views/themes/Cloth/checkout-cart.hbs index 5169153d..8d2ee75c 100644 --- a/views/themes/Cloth/checkout-cart.hbs +++ b/views/themes/Cloth/checkout-cart.hbs @@ -5,9 +5,9 @@
- Checkout + {{ @root.__ "Checkout" }}
- \ No newline at end of file + diff --git a/views/themes/Cloth/checkout-information.hbs b/views/themes/Cloth/checkout-information.hbs index 21125c2a..468631c0 100644 --- a/views/themes/Cloth/checkout-information.hbs +++ b/views/themes/Cloth/checkout-information.hbs @@ -1,14 +1,14 @@
@@ -70,14 +70,14 @@
{{/unless}}
@@ -95,4 +95,4 @@ - \ No newline at end of file + diff --git a/views/themes/Cloth/shipping-form.hbs b/views/themes/Cloth/shipping-form.hbs index d5ae16c6..9cc9db77 100644 --- a/views/themes/Cloth/shipping-form.hbs +++ b/views/themes/Cloth/shipping-form.hbs @@ -1,41 +1,41 @@
- +
- Please enter a valid email address + {{@root.__ "Please enter a valid email address"}}
- +
- +
- +
- +
- +
+
- +
- +
- +
-
\ No newline at end of file + From a341d3fc57502fc4cb6cbf94446b8ce929f1eebb Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 27 Aug 2021 20:03:55 +0300 Subject: [PATCH 17/79] product can be edited in multiple languages, without breaking current schema Signed-off-by: nick --- app.js | 7 +++++ config/settings.json | 2 +- public/javascripts/admin.js | 8 ++++- routes/product.js | 6 +++- views/product-edit.hbs | 59 +++++++++++++++++++++++++++++++++++-- 5 files changed, 77 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index c369d7f6..f75aa13f 100644 --- a/app.js +++ b/app.js @@ -309,6 +309,12 @@ handlebars = handlebars.create({ timeAgo: (date) => { return moment(date).fromNow(); }, + setVar: (varName, varValue, options) => { + options.data.root[varName] = varValue; + }, + getDescriptionLanguage: (result, language) => { + return result[`productDescription_${language}`] ? result[`productDescription_${language}`] : "" + }, feather: (icon) => { // eslint-disable-next-line keyword-spacing return ` `; } + } }); diff --git a/config/settings.json b/config/settings.json index c9b23578..8e938ee0 100644 --- a/config/settings.json +++ b/config/settings.json @@ -29,7 +29,7 @@ "it", "ro" ], - "defaultLocale": "ro", + "defaultLocale": "en", "maxQuantity": 25, "twitterHandle": "", "facebookAppId": "", diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index d9662a9d..a0d8ce43 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -241,11 +241,16 @@ $(document).ready(function (){ }); $('#productEditForm').validator().on('submit', function(e){ + if(!e.isDefaultPrevented()){ e.preventDefault(); if($('#productPermalink').val() === '' && $('#productTitle').val() !== ''){ $('#productPermalink').val(slugify($('#productTitle').val())); } + const varfields = allLanguages.reduce((acc,x) => { + acc[`productDescription_${x}`] = $(`#productDescription_${x}`).val(); + return acc; + },{}); $.ajax({ method: 'POST', url: '/admin/product/update', @@ -262,7 +267,8 @@ $(document).ready(function (){ productPermalink: $('#productPermalink').val(), productSubscription: $('#productSubscription').val(), productComment: $('#productComment').is(':checked'), - productTags: $('#productTags').val() + productTags: $('#productTags').val(), + ...varfields } }) .done(function(msg){ diff --git a/routes/product.js b/routes/product.js index 5002fe23..2116b9cb 100644 --- a/routes/product.js +++ b/routes/product.js @@ -185,7 +185,7 @@ router.get('/admin/product/edit/:id', restrict, checkAccess, async (req, res) => messageType: clearSessionValue(req.session, 'messageType'), config: req.app.config, editor: true, - helpers: req.handlebars.helpers + helpers: req.handlebars.helpers, }); }); @@ -337,6 +337,10 @@ router.post('/admin/product/update', restrict, checkAccess, async (req, res) => productStockDisable: convertBool(req.body.productStockDisable) }; + req.app.config.availableLanguages.map((lang) => { + productDoc[`productDescription_${lang}`] = cleanHtml(req.body[`productDescription_${lang}`]); + }) + // Validate the body again schema const schemaValidate = validateJson('editProduct', productDoc); if(!schemaValidate.result){ diff --git a/views/product-edit.hbs b/views/product-edit.hbs index a7330f8f..7148003d 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -11,6 +11,11 @@
+
@@ -71,7 +76,11 @@
- + + {{#availableLanguages}} + + {{/availableLanguages}} +
@@ -215,10 +224,56 @@ \ No newline at end of file + From f18d31ae0c415b8fe6937431c50e75d3c703cb0e Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 27 Aug 2021 21:21:18 +0300 Subject: [PATCH 18/79] titles are also variable Signed-off-by: nick --- app.js | 17 +++++++++++++++++ locales/en.json | 7 ++++--- public/javascripts/admin.js | 1 + routes/product.js | 3 +++ views/product-edit.hbs | 23 ++++++++++++++++------- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/app.js b/app.js index f75aa13f..69f4915e 100644 --- a/app.js +++ b/app.js @@ -214,6 +214,13 @@ handlebars = handlebars.create({ discountExpiry: (start, end) => { return moment().isBetween(moment(start), moment(end)); }, + IsHidden: (v1, operator, v2) => { + switch(operator){ + case '==': + return (v1 === v2) ? "" : "hidden" + + } + }, ifCond: (v1, operator, v2, options) => { switch(operator){ case '==': @@ -315,6 +322,16 @@ handlebars = handlebars.create({ getDescriptionLanguage: (result, language) => { return result[`productDescription_${language}`] ? result[`productDescription_${language}`] : "" }, + getExtraLanguageFromKey: (result, key, language, defaultLanguage) => { + if (defaultLanguage !== language) { + return result[`${key}_${language}`] ? result[`${key}_${language}`] : "" + } else { + return result[key]; + } + }, + getIdForLanguages : (idName, language, defaultLanguage) => { + return defaultLanguage === language ?idName : `${idName}_${language}`; + }, feather: (icon) => { // eslint-disable-next-line keyword-spacing return ` { acc[`productDescription_${x}`] = $(`#productDescription_${x}`).val(); + acc[`productTitle_${x}`] = $(`#productTitle_${x}`).val(); return acc; },{}); $.ajax({ diff --git a/routes/product.js b/routes/product.js index 2116b9cb..d7530dc9 100644 --- a/routes/product.js +++ b/routes/product.js @@ -340,6 +340,9 @@ router.post('/admin/product/update', restrict, checkAccess, async (req, res) => req.app.config.availableLanguages.map((lang) => { productDoc[`productDescription_${lang}`] = cleanHtml(req.body[`productDescription_${lang}`]); }) + req.app.config.availableLanguages.map((lang) => { + productDoc[`productTitle_${lang}`] = cleanHtml(req.body[`productTitle_${lang}`]); + }) // Validate the body again schema const schemaValidate = validateJson('editProduct', productDoc); diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 7148003d..fc73d960 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -18,7 +18,9 @@
- + {{#availableLanguages}} + + {{/availableLanguages}}
@@ -101,9 +103,9 @@
  • -
    Title
    -
    Price
    -
    Stock
    +
    {{ @root.__ "Title" }}
    +
    {{ @root.__ "Price" }}
    +
    {{ @root.__ "Stock" }}
    @@ -235,16 +237,18 @@ const allLanguages = getAllLanguages(); const switchLanguage = (defaultLang) => { - console.log(defaultLang) const e = document.getElementById("languageSelector"); const language = e.value; + const nonDefaultLanguages = allLanguages.filter((x) => x!= defaultLang); if(language === defaultLang){ console.log("show default") - allLanguages.forEach((language) => { + nonDefaultLanguages.forEach((language) => { document.getElementById("productDescription_".concat(language)).hidden = true + document.getElementById("productTitle_".concat(language)).hidden = true $("productDescription_".concat(language)).summernote('destroy'); }) document.getElementById("productDescription").hidden = false + document.getElementById("productTitle").hidden = false $('#productDescription').summernote({ height: 300, minHeight: null @@ -253,14 +257,19 @@ const switchLanguage = (defaultLang) => { }else{ console.log("show other") document.getElementById("productDescription").hidden = true + document.getElementById("productTitle").hidden = true + $('#productDescription').summernote('destroy'); - allLanguages.forEach((language) => { + nonDefaultLanguages.forEach((language) => { document.getElementById("productDescription_".concat(language)).hidden = true + document.getElementById("productTitle_".concat(language)).hidden = true $("productDescription_".concat(language)).summernote('destroy'); }) document.getElementById("productDescription_".concat(language)).hidden = false + document.getElementById("productTitle_".concat(language)).hidden = false + $("productDescription_".concat(language)).summernote({ height: 300, minHeight: null From 72f6c9fc0e226a449c7c8192d85dd42d32b6a6c8 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 27 Aug 2021 22:42:25 +0300 Subject: [PATCH 19/79] variants can be translated Signed-off-by: nick --- locales/en.json | 4 ++- public/javascripts/admin.js | 12 +++++-- routes/product.js | 7 +++- views/partials/variantEditModal.hbs | 16 +++++---- views/product-edit.hbs | 51 ++++++++++++++++++----------- 5 files changed, 59 insertions(+), 31 deletions(-) diff --git a/locales/en.json b/locales/en.json index dda40611..fe1647e9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -241,5 +241,7 @@ "Product is great. Does everything it said it can do.": "Product is great. Does everything it said it can do.", "Rating": "Rating", "Price": "Price", - "Stock": "Stock" + "Stock": "Stock", + "Product variant": "Product variant", + "Save variant": "Save variant" } \ No newline at end of file diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index 507b05e0..59d46a09 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -45,6 +45,7 @@ $(document).ready(function (){ $(document).on('click', '#saveVariant', function(e){ e.preventDefault(); + $.ajax({ method: 'POST', url: '/admin/product/editvariant', @@ -53,7 +54,8 @@ $(document).ready(function (){ variant: $('#variant-edit-id').val(), title: $('#variant-edit-title').val(), price: $('#variant-edit-price').val(), - stock: $('#variant-edit-stock').val() + stock: $('#variant-edit-stock').val(), + language: $('#variant-edit-language').val(), } }) .done(function(msg){ @@ -69,11 +71,16 @@ $(document).ready(function (){ $('#variant-edit-title').focus(); $('#variant-edit-id').val($(e.relatedTarget).data('id')); $('#variant-edit-title').val($(e.relatedTarget).data('title')); + $('#variant-edit-language').val($(e.relatedTarget).data('language')); $('#variant-edit-price').val($(e.relatedTarget).data('price')); $('#variant-edit-stock').val($(e.relatedTarget).data('stock')); }); $(document).on('click', '#addVariant', function(e){ + const varfields = allLanguages.reduce((acc,x) => { + acc[`variantTitle_${x}`] = $(`#variant-title_${x}`).val(); + return acc; + },{}); $.ajax({ method: 'POST', url: '/admin/product/addvariant', @@ -81,7 +88,8 @@ $(document).ready(function (){ product: $('#variant-product').val(), title: $('#variant-title').val(), price: $('#variant-price').val(), - stock: $('#variant-stock').val() + stock: $('#variant-stock').val(), + ...varfields } }) .done(function(msg){ diff --git a/routes/product.js b/routes/product.js index d7530dc9..a9fc9387 100644 --- a/routes/product.js +++ b/routes/product.js @@ -236,7 +236,7 @@ router.post('/admin/product/addvariant', restrict, checkAccess, async (req, res) // Update an existing product variant router.post('/admin/product/editvariant', restrict, checkAccess, async (req, res) => { const db = req.app.db; - + const defaultLang = req.app.config.defaultLocale; const variantDoc = { product: req.body.product, variant: req.body.variant, @@ -245,8 +245,13 @@ router.post('/admin/product/editvariant', restrict, checkAccess, async (req, res stock: safeParseInt(req.body.stock) || null }; + // Validate the body again schema const schemaValidate = validateJson('editVariant', variantDoc); + if(req.body.language !== defaultLang){ + delete variantDoc.title; + variantDoc[`title_${req.body.language}`] = req.body.title + } if(!schemaValidate.result){ if(process.env.NODE_ENV !== 'test'){ console.log('schemaValidate errors', schemaValidate.errors); diff --git a/views/partials/variantEditModal.hbs b/views/partials/variantEditModal.hbs index 7b038285..c9e50714 100644 --- a/views/partials/variantEditModal.hbs +++ b/views/partials/variantEditModal.hbs @@ -2,7 +2,7 @@
    -
\ No newline at end of file +
diff --git a/views/product-edit.hbs b/views/product-edit.hbs index fc73d960..df42fe31 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -115,7 +115,13 @@ {{#each result.variants}}
  • -
    {{this.title}}
    + {{#availableLanguages}} +
    {{getExtraLanguageFromKey ../this 'title' this @root.config.defaultLocale}} +
    + {{/availableLanguages}} +
    {{currencySymbol config.currencySymbol}}{{formatAmount this.price}}
    {{#if this.stock}}
    {{this.stock}}
    @@ -123,12 +129,16 @@
    N/A
    {{/if}}
    - + {{/availableLanguages}}
    @@ -234,6 +244,7 @@ const getAllLanguages = () => { return languages; } const allLanguages = getAllLanguages(); +const translatableFields = ["productDescription","productTitle","variantTitle", "variantButton"]; const switchLanguage = (defaultLang) => { @@ -243,12 +254,14 @@ const switchLanguage = (defaultLang) => { if(language === defaultLang){ console.log("show default") nonDefaultLanguages.forEach((language) => { - document.getElementById("productDescription_".concat(language)).hidden = true - document.getElementById("productTitle_".concat(language)).hidden = true - $("productDescription_".concat(language)).summernote('destroy'); + translatableFields.forEach((fieldId) => { + document.getElementById(fieldId.concat("_").concat(language)).hidden = true + }) + $("productDescription_".concat(language)).summernote('destroy'); + }) + translatableFields.forEach((fieldId) => { + document.getElementById(fieldId).hidden = false }) - document.getElementById("productDescription").hidden = false - document.getElementById("productTitle").hidden = false $('#productDescription').summernote({ height: 300, minHeight: null @@ -256,19 +269,17 @@ const switchLanguage = (defaultLang) => { }else{ console.log("show other") - document.getElementById("productDescription").hidden = true - document.getElementById("productTitle").hidden = true - + translatableFields.forEach((fieldId) => document.getElementById(fieldId).hidden = true) $('#productDescription').summernote('destroy'); nonDefaultLanguages.forEach((language) => { - document.getElementById("productDescription_".concat(language)).hidden = true - document.getElementById("productTitle_".concat(language)).hidden = true - $("productDescription_".concat(language)).summernote('destroy'); - }) + translatableFields.forEach((fieldId) => document.getElementById(fieldId.concat("_").concat(language)).hidden = true) + $("productDescription_".concat(language)).summernote('destroy'); + }) - document.getElementById("productDescription_".concat(language)).hidden = false - document.getElementById("productTitle_".concat(language)).hidden = false + translatableFields.forEach((fieldId) => { + document.getElementById(fieldId.concat("_").concat(language)).hidden = false + }) $("productDescription_".concat(language)).summernote({ height: 300, From 1b0f244988d6cef4bce60deb07e0936f3c1f5ae6 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 27 Aug 2021 23:35:38 +0300 Subject: [PATCH 20/79] make menu multilanguage in view Signed-off-by: nick --- app.js | 1 + lib/menu.js | 9 +++++++-- locales/en.json | 3 ++- locales/it.json | 14 ++++++++++++-- locales/ro.json | 9 +++++++-- routes/index.js | 3 +-- views/partials/menu.hbs | 16 ++++++++-------- views/themes/Cloth/front-menu.hbs | 4 ++-- 8 files changed, 40 insertions(+), 19 deletions(-) diff --git a/app.js b/app.js index 69f4915e..5139eae4 100644 --- a/app.js +++ b/app.js @@ -375,6 +375,7 @@ app.set('port', process.env.PORT || 1111); app.use(logger('dev')); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser(config.secretCookie)); + app.use(session({ resave: true, saveUninitialized: true, diff --git a/lib/menu.js b/lib/menu.js index fd29cc75..a435185c 100644 --- a/lib/menu.js +++ b/lib/menu.js @@ -1,7 +1,12 @@ const _ = require('lodash'); -const getMenu = (db) => { - return db.menu.findOne({}); +const getMenu = async (db, language) => { + if (language) { + const menu = await db.menu.findOne({language: language}); + if (menu) return menu; + } + return await db.menu.findOne({language: {$exists: false}}) + }; // creates a new menu item diff --git a/locales/en.json b/locales/en.json index fe1647e9..e680cf36 100644 --- a/locales/en.json +++ b/locales/en.json @@ -243,5 +243,6 @@ "Price": "Price", "Stock": "Stock", "Product variant": "Product variant", - "Save variant": "Save variant" + "Save variant": "Save variant", + "Home": "Home" } \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index e815f4e8..cc6609cf 100644 --- a/locales/it.json +++ b/locales/it.json @@ -185,5 +185,15 @@ "Customers can be filtered by: email, name or phone number": "Customers can be filtered by: email, name or phone number", "Password": "Password", "Create Order": "Create Order", - "Create order": "Create order" -} + "Create order": "Create order", + "Home": "Home", + "Cart Empty": "Cart Empty", + "Product review": "Product review", + "Title": "Title", + "Love it": "Love it", + "Description": "Description", + "Product is great. Does everything it said it can do.": "Product is great. Does everything it said it can do.", + "Rating": "Rating", + "Cancel": "Cancel", + "Add review": "Add review" +} \ No newline at end of file diff --git a/locales/ro.json b/locales/ro.json index 3b1d9888..4509e216 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -239,5 +239,10 @@ "Love it": "Iubește-l", "Description": "Descriere", "Product is great. Does everything it said it can do.": "Produsul este grozav. Face tot ce a spus că poate face.", - "Rating": "Rating" -} + "Rating": "Rating", + "Product variant": "Product variant", + "Price": "Price", + "Stock": "Stock", + "Save variant": "Save variant", + "Home": "Home" +} \ No newline at end of file diff --git a/routes/index.js b/routes/index.js index 920194d3..755b3801 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1108,12 +1108,11 @@ router.get('/:page?', async (req, res, next) => { const db = req.app.db; const config = req.app.config; const numberProducts = config.productsPerPage ? config.productsPerPage : 6; - // if no page is specified, just render page 1 of the cart if(!req.params.page){ Promise.all([ paginateProducts(true, db, 1, {}, getSort()), - getMenu(db) + getMenu(db,req.cookies.locale) ]) .then(async([results, menu]) => { // If JSON query param return json instead diff --git a/views/partials/menu.hbs b/views/partials/menu.hbs index a3378f4c..bc0ec7ee 100644 --- a/views/partials/menu.hbs +++ b/views/partials/menu.hbs @@ -12,13 +12,13 @@
  • {{#ifCond session.isAdmin '===' true}} {{/ifCond}} {{/if}}
    - {{#availableLanguages}} {{/availableLanguages}} @@ -247,47 +247,6 @@ const allLanguages = getAllLanguages(); const translatableFields = ["productDescription","productTitle","variantTitle", "variantButton"]; -const switchLanguage = (defaultLang) => { - const e = document.getElementById("languageSelector"); - const language = e.value; - const nonDefaultLanguages = allLanguages.filter((x) => x!= defaultLang); - if(language === defaultLang){ - console.log("show default") - nonDefaultLanguages.forEach((language) => { - translatableFields.forEach((fieldId) => { - document.getElementById(fieldId.concat("_").concat(language)).hidden = true - }) - $("productDescription_".concat(language)).summernote('destroy'); - }) - translatableFields.forEach((fieldId) => { - document.getElementById(fieldId).hidden = false - }) - $('#productDescription').summernote({ - height: 300, - minHeight: null - }); - - }else{ - console.log("show other") - translatableFields.forEach((fieldId) => document.getElementById(fieldId).hidden = true) - $('#productDescription').summernote('destroy'); - - nonDefaultLanguages.forEach((language) => { - translatableFields.forEach((fieldId) => document.getElementById(fieldId.concat("_").concat(language)).hidden = true) - $("productDescription_".concat(language)).summernote('destroy'); - }) - - translatableFields.forEach((fieldId) => { - document.getElementById(fieldId.concat("_").concat(language)).hidden = false - }) - - $("productDescription_".concat(language)).summernote({ - height: 300, - minHeight: null - }); - } - - } $(document).ready(function() { diff --git a/views/settings-menu.hbs b/views/settings-menu.hbs index 80bd8f95..9e0e401a 100644 --- a/views/settings-menu.hbs +++ b/views/settings-menu.hbs @@ -3,31 +3,49 @@

    Menu

    +
    Menu
    -
    link
    -
    +
    link
    +
    - {{#each menu.items}} - + {{#each menus}} + {{#availableLanguages}} + {{#isMatchingLanguageOrDefault ../this this @root.config.defaultLocale}} + {{#each ../../this.items}} +
    + +
    + {{else}} + + {{/each}} + {{/isMatchingLanguageOrDefault}} +{{/availableLanguages}} + {{/each}}
    @@ -47,3 +65,18 @@

    + Date: Sat, 28 Aug 2021 03:22:59 +0300 Subject: [PATCH 22/79] add new menu is also multilanguage. on adding menu in a new language, the default menu will be copied Signed-off-by: nick --- lib/menu.js | 27 +++++++++++++++++++-------- public/javascripts/admin.js | 4 +++- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lib/menu.js b/lib/menu.js index d6653e64..278654e9 100644 --- a/lib/menu.js +++ b/lib/menu.js @@ -1,11 +1,14 @@ const _ = require('lodash'); +const {config} = require("dotenv"); +const { getConfig } = require('../lib/config'); +const Config = getConfig() const getMenu = async (db, language) => { - if (language) { + if (language && language !== Config.defaultLocale) { const menu = await db.menu.findOne({language: language}); if (menu) return menu; } - return await db.menu.findOne({language: {$exists: false}}) + return await db.menu.findOne({language: {$exists: false}}); }; const getMenus = async (db) => (await db.menu.find({}).toArray()); @@ -13,10 +16,10 @@ const getMenus = async (db) => (await db.menu.find({}).toArray()); // creates a new menu item const newMenu = (req) => { const db = req.app.db; - return getMenu(db) - .then((menu) => { + return getMenu(db,req.body.language) + .then(async (menu) => { // if no menu present - if(!menu){ + if (!menu) { menu = {}; menu.items = []; } @@ -27,10 +30,18 @@ const newMenu = (req) => { }; menu.items.push(newNav); - return db.menu.updateOne({}, { $set: { items: menu.items } }, { upsert: true }) - .then(() => { + try{ + if (menu._id && (menu.language || (req.body.language === Config.defaultLocale))) { + await db.menu.updateOne({_id: menu._id}, {$set: {items: menu.items}}) + } else { + await db.menu.insertOne({items: menu.items, language: req.body.language}) + } return true; - }); + }catch(e){ + return false; + } + + }) .catch((err) => { console.log('Error creating new menu', err); diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index b8f67c09..4cb247e4 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -710,12 +710,14 @@ $(document).ready(function (){ $(document).on('click', '#settings-menu-new', function(e){ e.preventDefault(); + const language = document.getElementById("languageSelector").value; $.ajax({ method: 'POST', url: '/admin/settings/menu/new', data: { navMenu: $('#newNavMenu').val(), - navLink: $('#newNavLink').val() + navLink: $('#newNavLink').val(), + language: language } }) .done(function(msg){ From 31c00f34823ea13961e850fc7d62842fe63cbf02 Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 04:04:25 +0300 Subject: [PATCH 23/79] menu will need an unique identifier. searching on current menu name is not sufficient WIP Signed-off-by: nick --- app.js | 3 +++ locales/it.json | 10 +++++++++- public/javascripts/admin.js | 7 ++++++- routes/index.js | 12 ++++++------ views/settings-menu.hbs | 6 ++++-- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app.js b/app.js index 496aea11..d711d354 100644 --- a/app.js +++ b/app.js @@ -332,6 +332,9 @@ handlebars = handlebars.create({ getIdForLanguages : (idName, language, defaultLanguage) => { return defaultLanguage === language ?idName : `${idName}_${language}`; }, + getIdForLanguagesWithId : (idName,id, language, defaultLanguage) => { + return defaultLanguage === language ? `${idName}-${id}` : `${idName}-${id}_${language}`; + }, isMatchingLanguageOrDefault : (menu, lang2 , deflocale, options) => { const result = (lang2 === menu.language) || (typeof menu.language === "undefined" && deflocale === lang2); return result ? options.fn(this) : options.inverse(this); diff --git a/locales/it.json b/locales/it.json index cc6609cf..1312220b 100644 --- a/locales/it.json +++ b/locales/it.json @@ -195,5 +195,13 @@ "Product is great. Does everything it said it can do.": "Product is great. Does everything it said it can do.", "Rating": "Rating", "Cancel": "Cancel", - "Add review": "Add review" + "Add review": "Add review", + "Manage": "Manage", + "Reviews": "Reviews", + "Logout": "Logout", + "Shown in the variant dropdown": "Shown in the variant dropdown", + "Product variant": "Product variant", + "Price": "Price", + "Stock": "Stock", + "Save variant": "Save variant" } \ No newline at end of file diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index 4cb247e4..0b22a885 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -731,9 +731,14 @@ $(document).ready(function (){ $(document).on('click', '#settings-menu-update', function(e){ e.preventDefault(); const language = document.getElementById("languageSelector").value; + const defaultLocale = document.getElementById("defaultLocale").value; console.log(language); var id = $(this).attr('data-id'); - var parentEl = $('#menuId-' + id + '_' + language); + let parentEl = $('#menuId-' + id); + if(defaultLocale === language){ + parentEl = $('#menuId-' + id + '_' + language); + } + console.log(parentEl) $.ajax({ diff --git a/routes/index.js b/routes/index.js index 755b3801..4f9a2fec 100644 --- a/routes/index.js +++ b/routes/index.js @@ -146,7 +146,7 @@ router.get('/payment/:orderId', async (req, res, next) => { messageType: clearSessionValue(req.session, 'messageType'), helpers: req.handlebars.helpers, showFooter: 'showFooter', - menu: sortMenu(await getMenu(db)) + menu: sortMenu(await getMenu(db,req.cookies.locale)) }); }); @@ -507,7 +507,7 @@ router.get('/product/:id', async (req, res) => { messageType: clearSessionValue(req.session, 'messageType'), helpers: req.handlebars.helpers, showFooter: 'showFooter', - menu: sortMenu(await getMenu(db)) + menu: sortMenu(await getMenu(db,req.cookies.locale)) }); }); @@ -937,7 +937,7 @@ router.get('/search/:searchTerm/:pageNum?', (req, res) => { Promise.all([ paginateProducts(true, db, pageNum, { _id: { $in: lunrIdArray } }, getSort()), - getMenu(db) + getMenu(db,req.cookies.locale) ]) .then(([results, menu]) => { // If JSON query param return json instead @@ -990,7 +990,7 @@ router.get('/category/:cat/:pageNum?', (req, res) => { Promise.all([ paginateProducts(true, db, pageNum, { _id: { $in: lunrIdArray } }, getSort()), - getMenu(db) + getMenu(db,req.cookies.locale) ]) .then(([results, menu]) => { const sortedMenu = sortMenu(menu); @@ -1161,7 +1161,7 @@ router.get('/:page?', async (req, res, next) => { metaDescription: `${req.app.config.cartTitle} - ${page}`, helpers: req.handlebars.helpers, showFooter: 'showFooter', - menu: sortMenu(await getMenu(db)) + menu: sortMenu(await getMenu(db,req.cookies.locale)) }); }else{ res.status(404).render('error', { @@ -1170,7 +1170,7 @@ router.get('/:page?', async (req, res, next) => { message: '404 Error - Page not found', helpers: req.handlebars.helpers, showFooter: 'showFooter', - menu: sortMenu(await getMenu(db)) + menu: sortMenu(await getMenu(db,req.cookies.locale)) }); } } diff --git a/views/settings-menu.hbs b/views/settings-menu.hbs index 9e0e401a..c34204fa 100644 --- a/views/settings-menu.hbs +++ b/views/settings-menu.hbs @@ -3,6 +3,7 @@

    Menu

    + +
    + +
    {{{feather 'move'}}}
    From 111689521cd994825167e4ff9e282f311c1f1fbb Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 04:22:25 +0300 Subject: [PATCH 24/79] added Id to menu Signed-off-by: nick --- lib/menu.js | 3 ++- public/javascripts/admin.js | 3 ++- views/settings-menu.hbs | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/menu.js b/lib/menu.js index 278654e9..812a13d7 100644 --- a/lib/menu.js +++ b/lib/menu.js @@ -24,6 +24,7 @@ const newMenu = (req) => { menu.items = []; } const newNav = { + id : `${new Date().valueOf()}`, title: req.body.navMenu, link: req.body.navLink, order: Object.keys(menu.items).length + 1 @@ -72,7 +73,7 @@ const updateMenu = (req) => { return getMenu(db,req.body.language) .then((menu) => { // find menu item and update it - const menuIndex = _.findIndex(menu.items, ['title', req.body.navId]); + const menuIndex = _.findIndex(menu.items, ['id', req.body.navId]); menu.items[menuIndex].title = req.body.navMenu; menu.items[menuIndex].link = req.body.navLink; const updateQuery = (req.body.language === req.app.config.defaultLocale) ? {} : {language : req.body.language} diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index 0b22a885..053f5c9f 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -733,9 +733,10 @@ $(document).ready(function (){ const language = document.getElementById("languageSelector").value; const defaultLocale = document.getElementById("defaultLocale").value; console.log(language); + console.log(defaultLocale); var id = $(this).attr('data-id'); let parentEl = $('#menuId-' + id); - if(defaultLocale === language){ + if(defaultLocale !== language){ parentEl = $('#menuId-' + id + '_' + language); } console.log(parentEl) diff --git a/views/settings-menu.hbs b/views/settings-menu.hbs index c34204fa..d360e5f6 100644 --- a/views/settings-menu.hbs +++ b/views/settings-menu.hbs @@ -3,7 +3,7 @@

    Menu

    - + From 768ce20b92fa5147e8532d67e1b80e547139b8eb Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 05:56:27 +0300 Subject: [PATCH 25/79] made migration so current users can flawlessly upgrade to new menu bumped mongodb version Signed-off-by: nick --- app.js | 22 ++++++++++++++++++++++ docker-compose.yml | 2 +- lib/db.js | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index d711d354..39f87130 100644 --- a/app.js +++ b/app.js @@ -517,6 +517,7 @@ initDb(config.databaseConnectionString, async (err, db) => { await db.cart.deleteMany({ sessionId: { $nin: validSessionIds } }); + await versionUpdate(db); }); // Fire up the cron job to create google product feed @@ -544,6 +545,7 @@ initDb(config.databaseConnectionString, async (err, db) => { }); }; + // Set trackStock for testing if(process.env.NODE_ENV === 'test'){ config.trackStock = true; @@ -564,5 +566,25 @@ initDb(config.databaseConnectionString, async (err, db) => { process.exit(2); } }); +const versionUpdate = async (db) => { + const systeminfo = await db.systeminfo.findOne({}); + if(!systeminfo){ + console.warn('will upgrade data to latest version'); + try{ + const menus = await (db.menu.find({})).toArray(); + for(const menu of menus){ + const items = menu.items.map(x => { + x.id = `${Math.floor(Math.random()*10000000000)}` + return x; + }); + db.menu.updateOne({_id : menu._id},{$set : {items : items}}); + db.systeminfo.insertOne({_id : "version", value :"1.2.0"}); + } + }catch(e){ + console.error("upgrade failed",e); + } + + } +} module.exports = app; diff --git a/docker-compose.yml b/docker-compose.yml index 19c741fa..df12e567 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,7 @@ services: depends_on: - mongodb mongodb: - image: mongo:3.4.10 + image: mongo:5.0 container_name: "expresscart-mongodb" volumes: - expresscart-mongo-data:/data/db diff --git a/lib/db.js b/lib/db.js index 9acc661f..8e0d2295 100644 --- a/lib/db.js +++ b/lib/db.js @@ -36,6 +36,7 @@ function initDb(dbUrl, callback){ // eslint-disable-line db.sessions = db.collection('sessions'); db.discounts = db.collection('discounts'); db.reviews = db.collection('reviews'); + db.systeminfo = db.collection('systeminfo'); _db = db; return callback(null, _db); From d7b05f8aa953dbcef997361d12352c883c8ef65f Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 15:25:40 +0300 Subject: [PATCH 26/79] make variant translation show correct in options Signed-off-by: nick --- app.js | 6 ++++-- locales/it.json | 3 ++- public/javascripts/common.js | 10 ++++++++-- routes/index.js | 8 +++++++- views/product-edit.hbs | 8 +++++--- views/themes/Cloth/product.hbs | 4 ++-- 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/app.js b/app.js index 39f87130..891b41d4 100644 --- a/app.js +++ b/app.js @@ -567,8 +567,8 @@ initDb(config.databaseConnectionString, async (err, db) => { } }); const versionUpdate = async (db) => { - const systeminfo = await db.systeminfo.findOne({}); - if(!systeminfo){ + const version = await db.systeminfo.findOne({_id : "version"}); + if(!version){ console.warn('will upgrade data to latest version'); try{ const menus = await (db.menu.find({})).toArray(); @@ -584,6 +584,8 @@ const versionUpdate = async (db) => { console.error("upgrade failed",e); } + }else{ + console.log(`expressCart is running V${version.value}`); } } diff --git a/locales/it.json b/locales/it.json index 1312220b..ae5c42b4 100644 --- a/locales/it.json +++ b/locales/it.json @@ -203,5 +203,6 @@ "Product variant": "Product variant", "Price": "Price", "Stock": "Stock", - "Save variant": "Save variant" + "Save variant": "Save variant", + "View": "View" } \ No newline at end of file diff --git a/public/javascripts/common.js b/public/javascripts/common.js index fa4aca8a..8926f576 100644 --- a/public/javascripts/common.js +++ b/public/javascripts/common.js @@ -208,12 +208,16 @@ function slugify(str){ } -const switchLanguage = (defaultLang,translatableFields,allLanguages) => { +const switchLanguage = (defaultLang,translatableFields,allLanguages,translatableClass) => { const e = document.getElementById("languageSelector"); + const language = e.value; const nonDefaultLanguages = allLanguages.filter((x) => x != defaultLang); if (language === defaultLang) { + for (let el of document.querySelectorAll(`.${translatableClass}`)) el.hidden = false; + nonDefaultLanguages.forEach((language) => { + for (let el of document.querySelectorAll(`.${translatableClass}_${language}`)) el.hidden = true; translatableFields.forEach((fieldId) => { const item = document.getElementById(fieldId.concat("_").concat(language)) if(item) item.hidden = true @@ -233,8 +237,10 @@ const switchLanguage = (defaultLang,translatableFields,allLanguages) => { }) if (translatableFields.includes("productDescription")) $('#productDescription').summernote('destroy'); + for (let el of document.querySelectorAll(`.${translatableClass}`)) el.hidden = true; nonDefaultLanguages.forEach((language) => { + for (let el of document.querySelectorAll(`.${translatableClass}_${language}`)) el.hidden = true; translatableFields.forEach((fieldId) => { const item = document.getElementById(fieldId.concat("_").concat(language)) if (item) item.hidden = true @@ -246,7 +252,7 @@ const switchLanguage = (defaultLang,translatableFields,allLanguages) => { const item = document.getElementById(fieldId.concat("_").concat(language)) if (item) item.hidden = false }) - + for (let el of document.querySelectorAll(`.${translatableClass}_${language}`)) el.hidden = false; if (translatableFields.includes("productDescription")) $("productDescription_".concat(language)).summernote({height: 300, minHeight: null}); } diff --git a/routes/index.js b/routes/index.js index 4f9a2fec..da21c73a 100644 --- a/routes/index.js +++ b/routes/index.js @@ -413,7 +413,13 @@ router.get('/product/:id', async (req, res) => { } // Get variants for this product - const variants = await db.variants.find({ product: product._id }).sort({ added: 1 }).toArray(); + + let variants = await db.variants.find({ product: product._id }).sort({ added: 1 }).toArray(); + + variants = variants.map(x => { + x.title = req.cookies.locale !== req.app.config.defaultLocale ? x[`title_${req.cookies.locale}`] : x.title; + return x; + }); // Grab review data const reviews = { diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 87ce06bd..2f08af7b 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -11,7 +11,7 @@
    - {{#availableLanguages}} {{/availableLanguages}} @@ -116,10 +116,11 @@
  • {{#availableLanguages}} -
    {{getExtraLanguageFromKey ../this 'title' this @root.config.defaultLocale}} + class='col-sm-3 {{getIdForLanguages "language" this @root.config.defaultLocale}}'>{{getExtraLanguageFromKey ../this 'title' this @root.config.defaultLocale}}
    + {{/availableLanguages}}
    {{currencySymbol config.currencySymbol}}{{formatAmount this.price}}
    @@ -245,6 +246,7 @@ const getAllLanguages = () => { } const allLanguages = getAllLanguages(); const translatableFields = ["productDescription","productTitle","variantTitle", "variantButton"]; +const translatableClass = "language"; diff --git a/views/themes/Cloth/product.hbs b/views/themes/Cloth/product.hbs index 0e8c7046..5ac21e45 100644 --- a/views/themes/Cloth/product.hbs +++ b/views/themes/Cloth/product.hbs @@ -45,7 +45,7 @@ {{#ifCond result.productStock '==' 0}}

    - Out of stock + {{ @root.__ "Out of stock"}}

    {{/ifCond}} @@ -154,4 +154,4 @@ {{/if}}
    - \ No newline at end of file + From fc80d47d3cfac01de805b6dedaadca8db4953cee Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 15:59:21 +0300 Subject: [PATCH 27/79] save menus correct Signed-off-by: nick --- app.js | 6 ++++-- public/javascripts/common.js | 2 +- routes/admin.js | 10 +++++----- views/settings-menu.hbs | 15 +++++++-------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app.js b/app.js index 891b41d4..6b329ff4 100644 --- a/app.js +++ b/app.js @@ -517,7 +517,7 @@ initDb(config.databaseConnectionString, async (err, db) => { await db.cart.deleteMany({ sessionId: { $nin: validSessionIds } }); - await versionUpdate(db); + }); // Fire up the cron job to create google product feed @@ -556,6 +556,7 @@ initDb(config.databaseConnectionString, async (err, db) => { // Start the app try{ + await versionUpdate(db); await app.listen(app.get('port')); app.emit('appStarted'); if(process.env.NODE_ENV !== 'test'){ @@ -578,8 +579,9 @@ const versionUpdate = async (db) => { return x; }); db.menu.updateOne({_id : menu._id},{$set : {items : items}}); - db.systeminfo.insertOne({_id : "version", value :"1.2.0"}); + } + db.systeminfo.insertOne({_id : "version", value :"1.2.0"}); }catch(e){ console.error("upgrade failed",e); } diff --git a/public/javascripts/common.js b/public/javascripts/common.js index 8926f576..e644782a 100644 --- a/public/javascripts/common.js +++ b/public/javascripts/common.js @@ -212,7 +212,7 @@ const switchLanguage = (defaultLang,translatableFields,allLanguages,translatable const e = document.getElementById("languageSelector"); const language = e.value; - const nonDefaultLanguages = allLanguages.filter((x) => x != defaultLang); + const nonDefaultLanguages = allLanguages.filter((x) => x !== defaultLang); if (language === defaultLang) { for (let el of document.querySelectorAll(`.${translatableClass}`)) el.hidden = false; diff --git a/routes/admin.js b/routes/admin.js index 978b64c9..a00f260d 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -423,13 +423,13 @@ router.post('/admin/settings/menu/new', restrict, checkAccess, (req, res) => { }); // update existing menu item -router.post('/admin/settings/menu/update', restrict, checkAccess, (req, res) => { - const result = updateMenu(req); - if(result === false){ - res.status(400).json({ message: 'Failed updating menu.' }); +router.post('/admin/settings/menu/update', restrict, checkAccess, async (req, res) => { + const result = await updateMenu(req); + if (result === false) { + res.status(400).json({message: 'Failed updating menu.'}); return; } - res.status(200).json({ message: 'Menu updated successfully.' }); + res.status(200).json({message: 'Menu updated successfully.'}); }); // delete menu item diff --git a/views/settings-menu.hbs b/views/settings-menu.hbs index d360e5f6..6ed228a1 100644 --- a/views/settings-menu.hbs +++ b/views/settings-menu.hbs @@ -4,7 +4,7 @@

    Menu

    - {{#availableLanguages}} {{/availableLanguages}} @@ -19,8 +19,9 @@ {{#isMatchingLanguageOrDefault ../this this @root.config.defaultLocale}} {{#each ../../this.items}} -
    -
    + +
    +
    @@ -77,9 +78,7 @@ const getAllLanguages = () => { return languages; } const allLanguages = getAllLanguages(); -const translatableFields = ["navMenuTitle","menuRow","menuRow"]; -const switchLanguageMenu = (defaultLocale,translatableFields,allLanguages) => { -switchLanguage(defaultLocale,translatableFields,allLanguages); +const translatableFields = ["navMenuTitle","menuRow"]; +const translatableClass = "translatable"; -} - From 24f4bbe2a123f8b446d020f1499c243d5982d39c Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 17:15:28 +0300 Subject: [PATCH 28/79] fixed sorting on the menus Signed-off-by: nick --- app.js | 8 ++++++++ lib/menu.js | 40 +++++++++++++++++++++++-------------- public/javascripts/admin.js | 17 +++++++++++++--- routes/admin.js | 8 ++++---- views/settings-menu.hbs | 4 +++- 5 files changed, 54 insertions(+), 23 deletions(-) diff --git a/app.js b/app.js index 6b329ff4..df527dfb 100644 --- a/app.js +++ b/app.js @@ -332,6 +332,14 @@ handlebars = handlebars.create({ getIdForLanguages : (idName, language, defaultLanguage) => { return defaultLanguage === language ?idName : `${idName}_${language}`; }, + getIdForLanguagesForMenuId : (idName, language, defaultLanguage,menu) => { + if(menu.language === language || (!menu.language && language === defaultLanguage)){ + return defaultLanguage === language ?idName : `${idName}_${language}`; + }else{ + return "dont_use"; + } + + }, getIdForLanguagesWithId : (idName,id, language, defaultLanguage) => { return defaultLanguage === language ? `${idName}-${id}` : `${idName}-${id}_${language}`; }, diff --git a/lib/menu.js b/lib/menu.js index 812a13d7..257ac659 100644 --- a/lib/menu.js +++ b/lib/menu.js @@ -1,6 +1,7 @@ const _ = require('lodash'); const {config} = require("dotenv"); const { getConfig } = require('../lib/config'); +const ObjectId = require('mongodb').ObjectID; const Config = getConfig() const getMenu = async (db, language) => { @@ -11,6 +12,10 @@ const getMenu = async (db, language) => { return await db.menu.findOne({language: {$exists: false}}); }; +const getMenuById = async (db,id) => { + return await db.menu.findOne({_id: ObjectId(id)}); +} + const getMenus = async (db) => (await db.menu.find({}).toArray()); // creates a new menu item @@ -97,27 +102,32 @@ const sortMenu = (menu) => { }; // orders the menu -const orderMenu = (req, res) => { +const orderMenu = async (req, res) => { const db = req.app.db; - return getMenu(db) - .then((menu) => { - const menuOrder = req.body['order[]']; - // update the order - for(let i = 0; i < menuOrder.length; i++){ - _.find(menu.items, ['title', menuOrder[i]]).order = i; - } - return db.menu.updateOne({}, { $set: { items: menu.items } }, { upsert: true }) - .then(() => { - return true; + const menuId = req.body.menuId; + return await getMenuById(db,menuId) + .then((menu) => { + const menuOrder = req.body['order[]']; + // update the order + const existingIds = menu.items.map(x => x.id); + const menuOrderOnlyExistingIds = menuOrder.filter(x => existingIds.includes(x)); + for (let i = 0; i < menuOrderOnlyExistingIds.length; i++) { + _.find(menu.items, ['id', menuOrderOnlyExistingIds[i]]).order = i; + } + return db.menu.updateOne({_id:ObjectId(menuId)}, {$set: {items: menu.items}}, {upsert: true}) + .then(() => { + return true; + }); + }) + .catch((e) => { + console.error(e); + return false; }); - }) - .catch(() => { - return false; - }); }; module.exports = { getMenu, + getMenuById, getMenus, newMenu, deleteMenu, diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index 053f5c9f..9e24819b 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -784,11 +784,22 @@ $(document).ready(function (){ $('#draggable_list').sortable({ update: function (){ var menuOrder = []; - $('.navId').each(function(val){ - menuOrder.push($($('.navId')[val]).val()); + const language1 = document.getElementById("languageSelector").value; + const defaultLocale = document.getElementById("defaultLocale").value; + console.log(language1); + console.log(defaultLocale); + + let elementId = 'menuMongoId' + if(defaultLocale !== language1){ + elementId = 'menuMongoId_'+ language1 + } + const menuId = document.getElementById(elementId).value; + + $(`.navId.${language1}` ).each(function(val){ + menuOrder.push($($(`.navId.${language1}` )[val]).val()); }); $.ajax({ - data: { order: menuOrder }, + data: { order: menuOrder,menuId }, type: 'POST', url: '/admin/settings/menu/saveOrder' }) diff --git a/routes/admin.js b/routes/admin.js index a00f260d..d16f592b 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -443,10 +443,10 @@ router.post('/admin/settings/menu/delete', restrict, checkAccess, (req, res) => }); // We call this via a Ajax call to save the order from the sortable list -router.post('/admin/settings/menu/saveOrder', restrict, checkAccess, (req, res) => { - const result = orderMenu(req, res); - if(result === false){ - res.status(400).json({ message: 'Failed saving menu order' }); +router.post('/admin/settings/menu/saveOrder', restrict, checkAccess, async (req, res) => { + const result = await orderMenu(req, res); + if (result === false) { + res.status(400).json({message: 'Failed saving menu order'}); return; } res.status(200).json({}); diff --git a/views/settings-menu.hbs b/views/settings-menu.hbs index 6ed228a1..a5e9814f 100644 --- a/views/settings-menu.hbs +++ b/views/settings-menu.hbs @@ -15,14 +15,16 @@
    {{#each menus}} + {{#availableLanguages}} + {{#isMatchingLanguageOrDefault ../this this @root.config.defaultLocale}} {{#each ../../this.items}}
    - +
    {{{feather 'move'}}}
    From 516f71f5c4fc5aded17dd9e98c8ea7d47434fcae Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 17:25:45 +0300 Subject: [PATCH 29/79] products show with right language title & description Signed-off-by: nick --- public/javascripts/admin.js | 3 +-- routes/index.js | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index 9e24819b..babcd98e 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -732,8 +732,7 @@ $(document).ready(function (){ e.preventDefault(); const language = document.getElementById("languageSelector").value; const defaultLocale = document.getElementById("defaultLocale").value; - console.log(language); - console.log(defaultLocale); + var id = $(this).attr('data-id'); let parentEl = $('#menuId-' + id); if(defaultLocale !== language){ diff --git a/routes/index.js b/routes/index.js index da21c73a..266012ae 100644 --- a/routes/index.js +++ b/routes/index.js @@ -401,6 +401,8 @@ router.get('/product/:id', async (req, res) => { const db = req.app.db; const config = req.app.config; const productsIndex = req.app.productsIndex; + const language = req.cookies.locale; + const defaultLanguage = req.app.config.defaultLocale; const product = await db.products.findOne({ $or: [{ _id: getId(req.params.id) }, { productPermalink: req.params.id }] }); if(!product){ @@ -412,6 +414,12 @@ router.get('/product/:id', async (req, res) => { return; } + if(language !== defaultLanguage){ + product.productTitle = product[`productTitle_${language}`] ? product[`productTitle_${language}`] : product.productTitle; + product.productDescription = product[`productDescription_${language}`] ? product[`productDescription_${language}`] : product.productDescription; + } + + // Get variants for this product let variants = await db.variants.find({ product: product._id }).sort({ added: 1 }).toArray(); From 4e99e1b5abeaf4c36cbe3a7e7e5304b77370820d Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 17:33:12 +0300 Subject: [PATCH 30/79] right language on pages for product Signed-off-by: nick --- routes/index.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/routes/index.js b/routes/index.js index 266012ae..a42a01f1 100644 --- a/routes/index.js +++ b/routes/index.js @@ -414,11 +414,7 @@ router.get('/product/:id', async (req, res) => { return; } - if(language !== defaultLanguage){ - product.productTitle = product[`productTitle_${language}`] ? product[`productTitle_${language}`] : product.productTitle; - product.productDescription = product[`productDescription_${language}`] ? product[`productDescription_${language}`] : product.productDescription; - } - + translateProduct(language,defaultLanguage,product) // Get variants for this product @@ -1086,7 +1082,7 @@ router.get('/page/:pageNum', (req, res, next) => { Promise.all([ paginateProducts(true, db, req.params.pageNum, {}, getSort()), - getMenu(db) + getMenu(db,req.cookies.locale) ]) .then(([results, menu]) => { // If JSON query param return json instead @@ -1134,11 +1130,10 @@ router.get('/:page?', async (req, res, next) => { res.status(200).json(results.data); return; } - res.render(`${config.themeViews}index`, { title: `${config.cartTitle} - Shop`, theme: config.theme, - results: results.data, + results: results.data.map(x => translateProduct(req.cookies.locale,req.app.config.defaultLocale,x)), session: req.session, message: clearSessionValue(req.session, 'message'), messageType: clearSessionValue(req.session, 'messageType'), @@ -1190,4 +1185,13 @@ router.get('/:page?', async (req, res, next) => { } }); +const translateProduct = (language,defaultLanguage,product) => +{ + if (language !== defaultLanguage) { + product.productTitle = product[`productTitle_${language}`] ? product[`productTitle_${language}`] : product.productTitle; + product.productDescription = product[`productDescription_${language}`] ? product[`productDescription_${language}`] : product.productDescription; + } + return product; +} + module.exports = router; From 6b0d111d807f6a3ec424db6af4d7d19be76a8009 Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 17:39:18 +0300 Subject: [PATCH 31/79] show right language in related products Signed-off-by: nick --- routes/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routes/index.js b/routes/index.js index a42a01f1..0eed7c31 100644 --- a/routes/index.js +++ b/routes/index.js @@ -500,6 +500,7 @@ router.get('/product/:id', async (req, res) => { _id: { $in: lunrIdArray, $ne: product._id } }).limit(4).toArray(); } + const translated = relatedProducts.map(x => translateProduct(req.cookies.locale,req.app.config.defaultLocale,x)); res.render(`${config.themeViews}product`, { title: product.productTitle, @@ -507,7 +508,7 @@ router.get('/product/:id', async (req, res) => { variants, reviews, images: images, - relatedProducts, + relatedProducts : translated , productDescription: stripHtml(product.productDescription), metaDescription: `${config.cartTitle} - ${product.productTitle}`, config: config, From 2c5f2e41d738d7013fca43a5a144d94428ef1f45 Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 18:22:07 +0300 Subject: [PATCH 32/79] removed minimum length restrictions for non default language Signed-off-by: nick --- app.js | 6 ++++++ views/product-edit.hbs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index df527dfb..80ded816 100644 --- a/app.js +++ b/app.js @@ -343,6 +343,12 @@ handlebars = handlebars.create({ getIdForLanguagesWithId : (idName,id, language, defaultLanguage) => { return defaultLanguage === language ? `${idName}-${id}` : `${idName}-${id}_${language}`; }, + getMinLength : (language, defaultLanguage, minLengthIfDefaultLang ) => { + return language === defaultLanguage ? minLengthIfDefaultLang : 0 + }, + getRequired : (language, defaultLanguage ) => { + return language === defaultLanguage ? "required" : "" + }, isMatchingLanguageOrDefault : (menu, lang2 , deflocale, options) => { const result = (lang2 === menu.language) || (typeof menu.language === "undefined" && deflocale === lang2); return result ? options.fn(this) : options.inverse(this); diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 2f08af7b..6300134c 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -19,7 +19,7 @@
    {{#availableLanguages}} - + {{/availableLanguages}}
    From 474ec63d2b0eb94068da2a75173938905f5c2080 Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 28 Aug 2021 18:57:17 +0300 Subject: [PATCH 33/79] add new data to testdata catch promise of db connection --- bin/testdata.json | 7 ++++++- lib/db.js | 17 +++++++++-------- locales/en.json | 3 ++- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/bin/testdata.json b/bin/testdata.json index f2536d5b..7cfb79bc 100644 --- a/bin/testdata.json +++ b/bin/testdata.json @@ -242,15 +242,20 @@ "menu": { "items": [ { + "id" : "9999999999", "title": "Backpacks", "link": "/category/backpack", "order": 0 }, { + "id" : "1111111111", "title": "Boots", "link": "/category/boots", "order": 1 } ] + }, + "systeminfo" : { + "version": "1.2.0" } -} \ No newline at end of file +} diff --git a/lib/db.js b/lib/db.js index 8e0d2295..f56b01ed 100644 --- a/lib/db.js +++ b/lib/db.js @@ -8,13 +8,8 @@ function initDb(dbUrl, callback){ // eslint-disable-line console.warn('Trying to init DB again!'); return callback(null, _db); } - MongoClient.connect(dbUrl, { useNewUrlParser: true, useUnifiedTopology: true }, connected); - function connected(err, client){ - if(err){ - console.log('Failed connecting to the DB', err); - return callback(err); - } - + MongoClient.connect(dbUrl, { useNewUrlParser: true, useUnifiedTopology: true }) + .then((client) => { // Set the DB url dbUrl = getDbUri(dbUrl); @@ -40,7 +35,13 @@ function initDb(dbUrl, callback){ // eslint-disable-line _db = db; return callback(null, _db); - } + }) + .catch((err) =>{ + console.log('Failed connecting to the DB', err); + return callback(err); + }) + + }; function getDbUri(dbUrl){ diff --git a/locales/en.json b/locales/en.json index 76388f78..7d9c6c01 100644 --- a/locales/en.json +++ b/locales/en.json @@ -245,5 +245,6 @@ "Product variant": "Product variant", "Save variant": "Save variant", "Home": "Home", - "Manage": "Manage" + "Manage": "Manage", + "FREE shipping": "FREE shipping" } From 4bba15d4d662ebcc0e96a9ed3a7ec4462e03fc77 Mon Sep 17 00:00:00 2001 From: nick Date: Sun, 29 Aug 2021 18:23:04 +0300 Subject: [PATCH 34/79] if language is not passed in body of variants, we update default language --- locales/ro.json | 5 +++-- routes/product.js | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/locales/ro.json b/locales/ro.json index a0f493ce..8b914e26 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -245,5 +245,6 @@ "Stock": "Stock", "Save variant": "Save variant", "Home": "Home", - "Manage": "Manage" -} + "Manage": "Manage", + "FREE shipping": "FREE shipping" +} \ No newline at end of file diff --git a/routes/product.js b/routes/product.js index a9fc9387..f468a837 100644 --- a/routes/product.js +++ b/routes/product.js @@ -248,7 +248,7 @@ router.post('/admin/product/editvariant', restrict, checkAccess, async (req, res // Validate the body again schema const schemaValidate = validateJson('editVariant', variantDoc); - if(req.body.language !== defaultLang){ + if(req.body.language && (req.body.language !== defaultLang)){ delete variantDoc.title; variantDoc[`title_${req.body.language}`] = req.body.title } From 69d63ecbe856d63728a063b148e1d1fbf043d63e Mon Sep 17 00:00:00 2001 From: nick Date: Sun, 29 Aug 2021 22:36:59 +0300 Subject: [PATCH 35/79] google productfeeds in multiple languages Signed-off-by: nick --- lib/googledata.js | 35 +++++++++++++++++++++++++++++++++-- routes/index.js | 2 +- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/googledata.js b/lib/googledata.js index 470427d4..37c181f4 100755 --- a/lib/googledata.js +++ b/lib/googledata.js @@ -8,8 +8,9 @@ const { const writeGoogleData = async (db) => { const config = getConfig(); - const fileName = path.join('bin', 'googleproducts.xml'); - + const feedName = "googleproducts"; + const fileName = path.join('bin', `${feedName}.xml`); + let localized; // Remove old file try{ fs.unlinkSync(fileName); @@ -47,6 +48,22 @@ const writeGoogleData = async (db) => { 'g:image_link': `${config.baseUrl}/uploads/placeholder.png`, 'g:availability': 'in stock' }; + const extraLanguages = config.availableLanguages.filter(x => x !== config.defaultLocale); + //make localized feed per language + localized = extraLanguages.reduce((acc,language) => { + acc[language] = acc[language] ? acc[language] : []; + acc[language].push({ + 'g:title': product[`productTitle_${language}`], + 'g:id': product._id.toString(), + 'g:link': `${config.baseUrl}/product/${product.productPermalink}`, + 'g:description': product[`productTitle_${language}`], + 'g:price': `${product.productPrice} ${config.currencyISO}`, + 'g:image_link': `${config.baseUrl}/uploads/placeholder.png`, + 'g:availability': 'in stock' + }); + return acc; + }, {} ) + // Override image if exists if(product.productImage){ item['g:image_link'] = `${config.baseUrl}/${product.productImage}`; @@ -63,8 +80,22 @@ const writeGoogleData = async (db) => { // Generate XML const xml = convert.js2xml(jsonObj, xmlOpt); + // Write product file fs.writeFileSync(fileName, xml); + + for(const language in localized){ + jsonObj.rss.channel.item = []; + for(const productData of localized[language]){ + jsonObj.rss.channel.item.push(productData); + } + const fileName = path.join('bin', `${feedName}_${language}.xml`); + fs.writeFileSync(fileName, xml); + } + + + + }; module.exports = { diff --git a/routes/index.js b/routes/index.js index 0eed7c31..1cc45aa7 100644 --- a/routes/index.js +++ b/routes/index.js @@ -38,7 +38,7 @@ const { const countryList = getCountryList(); // Google products -router.get('/googleproducts.xml', async (req, res, next) => { +router.get(["/googleproducts.xml", "/googleproducts_*.xml"], async (req, res, next) => { let productsFile = ''; try{ productsFile = fs.readFileSync(path.join('bin', 'googleproducts.xml')); From 605ff5f099bc647ddc8fef41d07d4905698a03cf Mon Sep 17 00:00:00 2001 From: nick Date: Sun, 29 Aug 2021 22:50:49 +0300 Subject: [PATCH 36/79] completet translations ro --- locales/ro.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locales/ro.json b/locales/ro.json index 8b914e26..cb6bfabd 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -240,11 +240,11 @@ "Description": "Descriere", "Product is great. Does everything it said it can do.": "Produsul este grozav. Face tot ce a spus că poate face.", "Rating": "Rating", - "Product variant": "Product variant", - "Price": "Price", - "Stock": "Stock", - "Save variant": "Save variant", - "Home": "Home", - "Manage": "Manage", - "FREE shipping": "FREE shipping" -} \ No newline at end of file + "Price": "Preț", + "Stock": "Stoc", + "Product variant": "Varianta produsului", + "Save variant": "Salvează varianta", + "Home": "Acasă", + "Manage": "Gestionați", + "FREE shipping": "Livrare GRATUITĂ" +} From b08ebfdc018f19bdd527e40f31e5d9381b0f1186 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 30 Aug 2021 00:51:39 +0300 Subject: [PATCH 37/79] revised hooks & add product on create hook --- config/settings.json | 9 ++++++++ config/settingsSchema.json | 21 +++++++++++++++++++ lib/common.js | 15 ------------- lib/hooks.js | 43 ++++++++++++++++++++++++++++++++++++++ routes/index.js | 5 +++-- routes/product.js | 2 ++ 6 files changed, 78 insertions(+), 17 deletions(-) create mode 100644 lib/hooks.js diff --git a/config/settings.json b/config/settings.json index c9b23578..8a70a3f5 100644 --- a/config/settings.json +++ b/config/settings.json @@ -24,6 +24,15 @@ "theme": "Cloth", "trackStock": false, "orderHook": "", + "hooks" : { + "product" : { + "onCreate" : "http://localhost" + }, + "order" : { + "onCreate" : "http://localhost" + } + + }, "availableLanguages": [ "en", "it", diff --git a/config/settingsSchema.json b/config/settingsSchema.json index 5a1ce599..5a6b9153 100644 --- a/config/settingsSchema.json +++ b/config/settingsSchema.json @@ -126,6 +126,27 @@ "orderHook": { "format": "uri-template" }, + "hooks" : { + "type": "object", + "properties": { + "product" : { + "type": "object", + "properties": { + "onCreate": { + "format": "uri-template" + } + } + }, + "order" : { + "type": "object", + "properties": { + "onCreate": { + "format": "uri-template" + } + } + } + } + }, "secretCookie": { "type": "string" }, diff --git a/lib/common.js b/lib/common.js index 70c6cfc5..7eb41a05 100755 --- a/lib/common.js +++ b/lib/common.js @@ -239,20 +239,6 @@ const newId = () => { return new ObjectId(); }; -const hooker = (order) => { - const config = getConfig(); - - return axios.post(config.orderHook, order, { responseType: 'application/json' }) - .then((response) => { - if(response.status === 200){ - console.info('Successfully called order hook'); - } - }) - .catch((err) => { - console.log('Error calling hook:', err); - }); -}; - const getCountryList = () => { return countryArray; }; @@ -300,7 +286,6 @@ module.exports = { sendEmail, getId, newId, - hooker, getCountryList, cleanAmount, clearCustomer, diff --git a/lib/hooks.js b/lib/hooks.js new file mode 100644 index 00000000..427ce0b2 --- /dev/null +++ b/lib/hooks.js @@ -0,0 +1,43 @@ +const EventEmitter = require('events'); +const axios = require("axios"); +const hookEmitter = new EventEmitter(); +const config = require("./config").getConfig(); + +//support for previous config style +if (config.orderHook){ + registerHook({typeOfHook : "order", eventOfHook : "onCreate", callbackUrl : config.orderHook}); +} + +for (const typeOfHook in config.hooks) { + const hookEvents = config.hooks[typeOfHook]; + for (const eventOfHook in hookEvents) { + const callbackUrl = hookEvents[eventOfHook]; + registerHook({typeOfHook, eventOfHook, callbackUrl}); + } +} + + +function registerHook ({typeOfHook,eventOfHook,callbackUrl}){ + if(callbackUrl === "") return; + + console.log(`register ${typeOfHook} ${eventOfHook} on url ${callbackUrl}`) + hookEmitter.on(`${typeOfHook}_${eventOfHook}`, async payload => { + console.log(`calling hook ${typeOfHook} ${eventOfHook} on url ${callbackUrl}`) + try { + const response = await axios.post(callbackUrl, payload, {responseType: 'application/json'}) + if (200 <= response.status && response.status <= 299) { + console.info(`Successfully called order ${typeOfHook} ${eventOfHook} `); + } else { + throw (`not a 2xx response ${response.status} `); + } + } catch (e) { + console.error('Error calling hook:', e); + } + }) +} + +module.exports = hookEmitter; + + + + diff --git a/routes/index.js b/routes/index.js index 1cc45aa7..48e0a8f9 100644 --- a/routes/index.js +++ b/routes/index.js @@ -6,10 +6,10 @@ const moment = require('moment'); const fs = require('fs'); const path = require('path'); const _ = require('lodash'); +const hooker = require('../lib/hooks'); const ObjectId = require('mongodb').ObjectID; const { getId, - hooker, clearSessionValue, getImages, addSitemapProducts, @@ -125,7 +125,8 @@ router.get('/payment/:orderId', async (req, res, next) => { // If hooks are configured and the hook has not already been sent, send hook if(config.orderHook && !order.hookSent){ - await hooker(order); + hooker.emit('order_onCreate',order); + await db.orders.updateOne({ _id: getId(order._id) }, { diff --git a/routes/product.js b/routes/product.js index f468a837..86adf32d 100644 --- a/routes/product.js +++ b/routes/product.js @@ -17,6 +17,7 @@ const rimraf = require('rimraf'); const fs = require('fs'); const path = require('path'); const router = express.Router(); +const hooker = require('../lib/hooks'); router.get('/admin/products/:page?', restrict, async (req, res, next) => { let pageNum = 1; @@ -142,6 +143,7 @@ router.post('/admin/product/insert', restrict, checkAccess, async (req, res) => productId: newId }); }); + hooker.emit("product_onCreate",product); }catch(ex){ console.log(colors.red(`Error inserting document: ${ex}`)); res.status(400).json({ message: 'Error inserting document' }); From d879f851a6c581640dda3ed964b2d36427f56754 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 30 Aug 2021 03:23:49 +0300 Subject: [PATCH 38/79] fixed variant currency symbol added hook for new variant --- config/settings.json | 7 +++++-- config/settingsSchema.json | 8 ++++++++ locales/en.json | 8 ++++++-- routes/product.js | 4 ++++ views/product-edit.hbs | 2 +- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/config/settings.json b/config/settings.json index 8a70a3f5..a6d403e3 100644 --- a/config/settings.json +++ b/config/settings.json @@ -15,8 +15,8 @@ "googleAnalytics": "", "injectJs": "", "customCss": "", - "currencySymbol": "£", - "currencyISO": "USD", + "currencySymbol": "lei", + "currencyISO": "RON", "paymentGateway": [ "stripe" ], @@ -28,6 +28,9 @@ "product" : { "onCreate" : "http://localhost" }, + "variant" : { + "onCreate" : "http://localhost" + }, "order" : { "onCreate" : "http://localhost" } diff --git a/config/settingsSchema.json b/config/settingsSchema.json index 5a6b9153..b296333f 100644 --- a/config/settingsSchema.json +++ b/config/settingsSchema.json @@ -137,6 +137,14 @@ } } }, + "variant" : { + "type": "object", + "properties": { + "onCreate": { + "format": "uri-template" + } + } + }, "order" : { "type": "object", "properties": { diff --git a/locales/en.json b/locales/en.json index 7d9c6c01..976e81b5 100644 --- a/locales/en.json +++ b/locales/en.json @@ -246,5 +246,9 @@ "Save variant": "Save variant", "Home": "Home", "Manage": "Manage", - "FREE shipping": "FREE shipping" -} + "FREE shipping": "FREE shipping", + "Payment": "Payment", + "Create an account": "Create an account", + "Return to cart": "Return to cart", + "Continue to shipping": "Continue to shipping" +} \ No newline at end of file diff --git a/routes/product.js b/routes/product.js index 86adf32d..f6433ecc 100644 --- a/routes/product.js +++ b/routes/product.js @@ -228,6 +228,10 @@ router.post('/admin/product/addvariant', restrict, checkAccess, async (req, res) try{ const variant = await db.variants.insertOne(variantDoc); product.variants = variant.ops; + const productWithNewVariant = {...product, productVariants : [variant]}; + + hooker.emit("variant_onCreate",productWithNewVariant); + res.status(200).json({ message: 'Successfully added variant', product }); }catch(ex){ console.log('here?'); diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 6300134c..3ea21bb2 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -123,7 +123,7 @@ {{/availableLanguages}} -
    {{currencySymbol config.currencySymbol}}{{formatAmount this.price}}
    +
    {{currencySymbol @root.config.currencySymbol}}{{formatAmount this.price}}
    {{#if this.stock}}
    {{this.stock}}
    {{else}} From 70d633da5b2d1414ae78670249c8e56480e8a0ef Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 30 Aug 2021 03:24:29 +0300 Subject: [PATCH 39/79] space --- views/product-edit.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 3ea21bb2..ddb87350 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -123,7 +123,7 @@ {{/availableLanguages}} -
    {{currencySymbol @root.config.currencySymbol}}{{formatAmount this.price}}
    +
    {{currencySymbol @root.config.currencySymbol}} {{formatAmount this.price}}
    {{#if this.stock}}
    {{this.stock}}
    {{else}} From b4432a0a44ff6217867123da4bec5147ae7f8e44 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 30 Aug 2021 03:42:33 +0300 Subject: [PATCH 40/79] fixed summernote not showing up in admin panel when switching language --- config/settings.json | 2 +- public/javascripts/common.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/settings.json b/config/settings.json index a6d403e3..b9cd0681 100644 --- a/config/settings.json +++ b/config/settings.json @@ -41,7 +41,7 @@ "it", "ro" ], - "defaultLocale": "ro", + "defaultLocale": "en", "maxQuantity": 25, "twitterHandle": "", "facebookAppId": "", diff --git a/public/javascripts/common.js b/public/javascripts/common.js index e644782a..51676d1a 100644 --- a/public/javascripts/common.js +++ b/public/javascripts/common.js @@ -236,7 +236,7 @@ const switchLanguage = (defaultLang,translatableFields,allLanguages,translatable if (item) item.hidden = true }) - if (translatableFields.includes("productDescription")) $('#productDescription').summernote('destroy'); + if (translatableFields.includes(`productDescription`)) $('#productDescription').summernote('destroy'); for (let el of document.querySelectorAll(`.${translatableClass}`)) el.hidden = true; nonDefaultLanguages.forEach((language) => { @@ -245,7 +245,7 @@ const switchLanguage = (defaultLang,translatableFields,allLanguages,translatable const item = document.getElementById(fieldId.concat("_").concat(language)) if (item) item.hidden = true }) - if (translatableFields.includes("productDescription")) $("productDescription_".concat(language)).summernote('destroy'); + if (translatableFields.includes(`productDescription`)) $("#productDescription_".concat(language)).summernote('destroy'); }) translatableFields.forEach((fieldId) => { @@ -253,7 +253,7 @@ const switchLanguage = (defaultLang,translatableFields,allLanguages,translatable if (item) item.hidden = false }) for (let el of document.querySelectorAll(`.${translatableClass}_${language}`)) el.hidden = false; - if (translatableFields.includes("productDescription")) $("productDescription_".concat(language)).summernote({height: 300, minHeight: null}); + if (translatableFields.includes("productDescription")) $("#productDescription_".concat(language)).summernote({height: 300, minHeight: null}); } } From 8af96dbb14b51b82d5d63b96f836e0c2ffc9a418 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 30 Aug 2021 03:46:08 +0300 Subject: [PATCH 41/79] fixed double field in default lang on prodcut edit --- views/product-edit.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/product-edit.hbs b/views/product-edit.hbs index ddb87350..2e472700 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -80,7 +80,7 @@ {{#availableLanguages}} - + {{/availableLanguages}}
    From 02c47549f7f8f7936de5d863d5088316e7887b3e Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 30 Aug 2021 03:58:18 +0300 Subject: [PATCH 42/79] remove " --- views/product-edit.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 2e472700..4b00ba3e 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -80,7 +80,7 @@ {{#availableLanguages}} - + {{/availableLanguages}}
    From db98a255830d2af72c6140bd61650fb1379a8e29 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 30 Aug 2021 05:07:49 +0300 Subject: [PATCH 43/79] make resized thumbnails on upload Signed-off-by: nick --- lib/common.js | 2 +- package-lock.json | 10511 +++++++++++++++++++++++++++++++-- package.json | 3 +- routes/admin.js | 20 +- views/themes/Cloth/index.hbs | 26 +- 5 files changed, 10212 insertions(+), 350 deletions(-) diff --git a/lib/common.js b/lib/common.js index 7eb41a05..8ed5d7d1 100755 --- a/lib/common.js +++ b/lib/common.js @@ -144,7 +144,7 @@ const getImages = async (id, req, res, callback) => { } // loop files in /public/uploads/ - const files = await glob.sync(`public/uploads/${product._id.toString()}/**`, { nosort: true }); + const files = await glob.sync(`public/uploads/${product._id.toString()}/*`, { nosort: true }); // sort array files.sort(); diff --git a/package-lock.json b/package-lock.json index 5624b915..032a6bb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,9723 @@ { "name": "express-cart", "version": "1.1.19", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "express-cart", + "version": "1.1.19", + "license": "MIT", + "dependencies": { + "@adyen/api-library": "^2.1.7", + "ajv": "^6.10.2", + "ajv-errors": "^1.0.1", + "async": "^2.6.3", + "axios": "^0.21.1", + "badwords-list": "^1.0.0", + "bcryptjs": "^2.4.3", + "body-parser": "^1.19.0", + "cheerio": "^0.22.0", + "colors": "^1.4.0", + "connect-mongodb-session": "^2.2.0", + "cookie-parser": "^1.4.4", + "countries-list": "^2.5.0", + "csurf": "^1.11.0", + "dotenv": "^8.2.0", + "express": "^4.17.1", + "express-handlebars": "^3.1.0", + "express-rate-limit": "^5.0.0", + "express-session": "^1.17.0", + "feather-icons": "^4.25.0", + "glob": "^7.1.5", + "got": "^10.6.0", + "gulp-less": "^4.0.1", + "helmet": "^3.21.2", + "html-entities": "^1.2.0", + "i18n": "^0.8.4", + "lodash": "^4.17.15", + "lunr": "^2.3.8", + "mime-db": "^1.43.0", + "mime-type": "^3.0.7", + "mkdirp": "^0.5.5", + "moment": "^2.24.0", + "mongodb": "^3.3.3", + "mongodb-uri": "^0.9.7", + "morgan": "^1.9.1", + "multer": "^1.4.2", + "node-cron": "^2.0.3", + "nodemailer": "^6.4.16", + "numeral": "^2.0.6", + "object-hash": "^2.0.1", + "paypal-rest-sdk": "^1.6.9", + "rand-token": "^0.4.0", + "rimraf": "^2.7.1", + "sanitize-html": "^2.3.2", + "sharp": "^0.29.0", + "sitemap": "^1.6.0", + "string-strip-html": "^4.3.14", + "strip-bom": "^3.0.0", + "stripe": "^8.170.0", + "uglifycss": "0.0.27", + "xml-js": "^1.6.11", + "yenv": "^2.1.1" + }, + "devDependencies": { + "ava": "^3.13.0", + "clean-css": "^4.2.3", + "eslint": "^6.8.0", + "eslint-config-standard": "^13.0.1", + "eslint-plugin-extra-rules": "0.0.0-development", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-node": "^9.2.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "globby": "^11.0.1", + "less": "^3.12.2", + "pm2": "^4.5.0", + "supertest": "^4.0.2", + "uglify-es": "^3.3.9" + }, + "engines": { + "node": ">=10.16.0 <0.15" + } + }, + "node_modules/@adyen/api-library": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@adyen/api-library/-/api-library-2.1.7.tgz", + "integrity": "sha512-EQXOyXJ6A4ceqWYIiAwXdISVWVZfvQEPhf4roYkLiOL01GSTL0waWucUvS8tXOBOtSzrhTw1zUqC0YGBjULaRA==", + "dependencies": { + "https-proxy-agent": "3.0.1" + }, + "engines": { + "node": ">=8.1.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.0.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@concordance/react": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", + "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1" + }, + "engines": { + "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + } + }, + "node_modules/@concordance/react/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opencensus/core": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz", + "integrity": "sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==", + "dev": true, + "dependencies": { + "continuation-local-storage": "^3.2.1", + "log-driver": "^1.2.7", + "semver": "^5.5.0", + "shimmer": "^1.2.0", + "uuid": "^3.2.1" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@opencensus/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@opencensus/propagation-b3": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz", + "integrity": "sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==", + "dev": true, + "dependencies": { + "@opencensus/core": "^0.0.8", + "uuid": "^3.2.1" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@opencensus/propagation-b3/node_modules/@opencensus/core": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz", + "integrity": "sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==", + "dev": true, + "dependencies": { + "continuation-local-storage": "^3.2.1", + "log-driver": "^1.2.7", + "semver": "^5.5.0", + "shimmer": "^1.2.0", + "uuid": "^3.2.1" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@opencensus/propagation-b3/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@pm2/agent": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-1.0.4.tgz", + "integrity": "sha512-cZLwaoLa45FRuetKCcoI3kHnnQ7VMLpZnmVom04MoK0cpY/RxcSarkCHSCu9V+pdARwxx96QrWdrtAJdw97dng==", + "dev": true, + "dependencies": { + "async": "~3.2.0", + "chalk": "~3.0.0", + "dayjs": "~1.8.24", + "debug": "~4.1.1", + "eventemitter2": "~5.0.1", + "fclone": "~1.0.11", + "nssocket": "0.6.0", + "pm2-axon": "^3.2.0", + "pm2-axon-rpc": "^0.5.0", + "proxy-agent": "~3.1.1", + "semver": "~7.2.0", + "ws": "~7.2.0" + } + }, + "node_modules/@pm2/agent-node": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@pm2/agent-node/-/agent-node-1.1.10.tgz", + "integrity": "sha512-xRcrk7OEwhS3d/227/kKGvxgmbIi6Yyp27FzGlFNermEKhgddmFaRnmd7GRLIsBM/KB28NrwflBZulzk/mma6g==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "eventemitter2": "^5.0.1", + "proxy-agent": "^3.0.3", + "ws": "^6.0.0" + } + }, + "node_modules/@pm2/agent-node/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@pm2/agent-node/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==", + "dev": true + }, + "node_modules/@pm2/agent-node/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@pm2/agent/node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "node_modules/@pm2/agent/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@pm2/agent/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@pm2/agent/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==", + "dev": true + }, + "node_modules/@pm2/agent/node_modules/pm2-axon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-3.3.0.tgz", + "integrity": "sha512-dAFlFYRuFbFjX7oAk41zT+dx86EuaFX/TgOp5QpUKRKwxb946IM6ydnoH5sSTkdI2pHSVZ+3Am8n/l0ocr7jdQ==", + "dev": true, + "dependencies": { + "amp": "~0.3.1", + "amp-message": "~0.1.1", + "debug": "^3.0", + "escape-regexp": "0.0.1" + } + }, + "node_modules/@pm2/agent/node_modules/pm2-axon-rpc": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.5.2.tgz", + "integrity": "sha512-o4u1jO1EYBgBUVlraE1aeGWB5DvClJFB2+v7ytqLypNfgYeT6eJ/B+WMh5NcvRnexAYL5kblcRgNgSbgGEobvA==", + "dev": true, + "dependencies": { + "debug": "^3.0" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/@pm2/agent/node_modules/pm2-axon-rpc/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@pm2/agent/node_modules/pm2-axon/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@pm2/agent/node_modules/semver": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.2.3.tgz", + "integrity": "sha512-utbW9Z7ZxVvwiIWkdOMLOR9G/NFXh2aRucghkVrEMJWuC++r3lCkBC3LwqBinyHzGMAJxY5tn6VakZGHObq5ig==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/io": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@pm2/io/-/io-4.3.5.tgz", + "integrity": "sha512-CY/a6Nw72vrlp/FPx38l4jfEHp4gNEbo8i+WlSJ2cnWO6VE6CKmnC1zb4yQLvdP8f3EuzzoOBZVq6aGN20M82Q==", + "dev": true, + "dependencies": { + "@opencensus/core": "0.0.9", + "@opencensus/propagation-b3": "0.0.8", + "@pm2/agent-node": "^1.1.10", + "async": "~2.6.1", + "debug": "4.1.1", + "eventemitter2": "^6.3.1", + "require-in-the-middle": "^5.0.0", + "semver": "6.3.0", + "shimmer": "^1.2.0", + "signal-exit": "^3.0.3", + "tslib": "1.9.3" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@pm2/io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@pm2/io/node_modules/eventemitter2": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", + "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==", + "dev": true + }, + "node_modules/@pm2/io/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==", + "dev": true + }, + "node_modules/@pm2/io/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@pm2/io/node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/@pm2/io/node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "node_modules/@pm2/js-api": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.0.tgz", + "integrity": "sha512-ZgM/0yI8s3FRyxP01wI5UzDrVTecS/SmD98z25C9fsHo2Wz3JB1DtS4uIBlPopq2/R5HIQynTUJPDNn4qo1d/Q==", + "dev": true, + "dependencies": { + "async": "^2.6.3", + "axios": "^0.19.0", + "debug": "~3.2.6", + "eventemitter2": "^6.3.1", + "ws": "^7.0.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@pm2/js-api/node_modules/axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "dev": true, + "dependencies": { + "follow-redirects": "1.5.10" + } + }, + "node_modules/@pm2/js-api/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@pm2/js-api/node_modules/eventemitter2": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", + "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==", + "dev": true + }, + "node_modules/@pm2/js-api/node_modules/follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "dependencies": { + "debug": "=3.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@pm2/js-api/node_modules/follow-redirects/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@pm2/js-api/node_modules/follow-redirects/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/@pm2/js-api/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==", + "dev": true + }, + "node_modules/@pm2/pm2-version-check": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.3.tgz", + "integrity": "sha512-SBuYsh+o35knItbRW97vl5/5nEc5c5DYP7PxjyPLOfmm9bMaDsVeATXjXMBy6+KLlyrYWHZxGbfXe003NnHClg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@pm2/pm2-version-check/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@pm2/pm2-version-check/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==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz", + "integrity": "sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" + }, + "node_modules/@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "12.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz", + "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dependencies": { + "mime-db": "1.40.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types/node_modules/mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accord": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/accord/-/accord-0.29.0.tgz", + "integrity": "sha512-3OOR92FTc2p5/EcOzPcXp+Cbo+3C15nV9RXHlOUBCBpHhcB+0frbSNR9ehED/o7sTcyGVtqGJpguToEdlXhD0w==", + "dependencies": { + "convert-source-map": "^1.5.0", + "glob": "^7.0.5", + "indx": "^0.2.3", + "lodash.clone": "^4.3.2", + "lodash.defaults": "^4.0.1", + "lodash.flatten": "^4.2.0", + "lodash.merge": "^4.4.0", + "lodash.partialright": "^4.1.4", + "lodash.pick": "^4.2.1", + "lodash.uniq": "^4.3.0", + "resolve": "^1.5.0", + "semver": "^5.3.0", + "uglify-js": "^2.8.22", + "when": "^3.7.8" + } + }, + "node_modules/accord/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/accord/node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/accord/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/accord/node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/accord/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/accord/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "dev": true + }, + "node_modules/acorn-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.0.0.tgz", + "integrity": "sha512-oZRad/3SMOI/pxbbmqyurIx7jHw1wZDcR9G44L8pUVFEomX/0dH89SrM1KaDXuv1NpzAXz6Op/Xu/Qd5XXzdEA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dependencies": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", + "integrity": "sha1-at+NWKdPNh6CwfqNOJwHnhOfxH0=", + "dev": true + }, + "node_modules/amp-message": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", + "integrity": "sha1-p48cmJlQh602GSpBKY5NtJ49/EU=", + "dev": true, + "dependencies": { + "amp": "0.3.1" + } + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "dev": true, + "dependencies": { + "type-fest": "^0.5.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.1.0.tgz", + "integrity": "sha512-Qts4KCLKG+waHc9C4m07weIY8qyeixoS0h6RnbsNVD6Fw+pEZGW3vTyObL3WXpE09Mq4Oi7/lBEyLmOiLtlYWQ==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/archetype": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/archetype/-/archetype-0.8.8.tgz", + "integrity": "sha512-isdIbFfT3zXVan34hmxIwI8A5/8lo9MaYmwXF1iYWCnJS1GvKKnZ4GrXoOUgKdUMCiB/wdguRXeStCUQhFjexg==", + "dependencies": { + "lodash.clonedeep": "4.x", + "lodash.set": "4.x", + "lodash.unset": "4.x", + "mpath": "0.5.1", + "standard-error": "1.1.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types/node_modules/tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "dev": true, + "dependencies": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + }, + "engines": { + "node": "<=0.11.8 || >0.11.10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/ava": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-3.13.0.tgz", + "integrity": "sha512-yzky+gark5PdsFFlZ4CnBVxm/OgBUWtn9vAsSSnuooVJNOk5ER17HJXVeUzy63LIt06Zy34oThcn+2ZqgMs7SA==", + "dev": true, + "dependencies": { + "@concordance/react": "^2.0.0", + "acorn": "^8.0.1", + "acorn-walk": "^8.0.0", + "ansi-styles": "^4.2.1", + "arrgv": "^1.0.2", + "arrify": "^2.0.1", + "callsites": "^3.1.0", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "chunkd": "^2.0.1", + "ci-info": "^2.0.0", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "code-excerpt": "^3.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.1", + "convert-source-map": "^1.7.0", + "currently-unhandled": "^0.4.1", + "debug": "^4.2.0", + "del": "^6.0.0", + "emittery": "^0.7.1", + "equal-length": "^1.0.0", + "figures": "^3.2.0", + "globby": "^11.0.1", + "ignore-by-default": "^2.0.0", + "import-local": "^3.0.2", + "indent-string": "^4.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "lodash": "^4.17.20", + "matcher": "^3.0.0", + "md5-hex": "^3.0.1", + "mem": "^6.1.1", + "ms": "^2.1.2", + "ora": "^5.1.0", + "p-event": "^4.2.0", + "p-map": "^4.0.0", + "picomatch": "^2.2.2", + "pkg-conf": "^3.1.0", + "plur": "^4.0.0", + "pretty-ms": "^7.0.1", + "read-pkg": "^5.2.0", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "source-map-support": "^0.5.19", + "stack-utils": "^2.0.2", + "strip-ansi": "^6.0.0", + "supertap": "^1.0.0", + "temp-dir": "^2.0.0", + "trim-off-newlines": "^1.0.1", + "update-notifier": "^4.1.1", + "write-file-atomic": "^3.0.3", + "yargs": "^16.0.3" + }, + "bin": { + "ava": "cli.js" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <12.17.0 || >=12.17.0 <13 || >=14.0.0" + } + }, + "node_modules/ava/node_modules/acorn": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", + "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ava/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ava/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ava/node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/ava/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ava/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, + "node_modules/ava/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==", + "dev": true + }, + "node_modules/ava/node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/badwords-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/badwords-list/-/badwords-list-1.0.0.tgz", + "integrity": "sha1-XphW2/E0gqKVw7CzBK+51M/FxXk=" + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=", + "dev": true, + "bin": { + "blessed": "bin/tput.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/blueimp-md5": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz", + "integrity": "sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/bowser": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.7.0.tgz", + "integrity": "sha512-aIlMvstvu8x+34KEiOHD3AsBgdrzg6sxALYiukOWhFvGMbQI6TRP/iY0LMhUrHs56aD6P1G0Z7h45PUJaa5m9w==" + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "dependencies": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/busboy/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/busboy/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/busboy/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "dependencies": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", + "dev": true + }, + "node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", + "dev": true + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", + "dev": true + }, + "node_modules/classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", + "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-tableau": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", + "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", + "dev": true, + "dependencies": { + "chalk": "3.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/cli-tableau/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate/node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz", + "integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-excerpt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", + "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "dev": true, + "dependencies": { + "convert-to-spaces": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/coercer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/coercer/-/coercer-1.1.2.tgz", + "integrity": "sha1-6upEWVEfc/nzat4EqYEHznWCS3A=" + }, + "node_modules/color": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/color/-/color-4.0.1.tgz", + "integrity": "sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dependencies": { + "color-name": "^1.1.1" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "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=" + }, + "node_modules/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concordance": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.1.tgz", + "integrity": "sha512-TbNtInKVElgEBnJ1v2Xg+MFX2lvFLbmlv3EuSC5wTfCwpB8kC3w3mffF6cKuUhkn475Ym1f1I4qmuXzx2+uXpw==", + "dev": true, + "dependencies": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" + } + }, + "node_modules/concordance/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-mongodb-session": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/connect-mongodb-session/-/connect-mongodb-session-2.2.0.tgz", + "integrity": "sha512-7TMsEKzL8Fys9h7jU4MP1Qg2rySokjyFk7diQJITaDKcweWakXcLI9jDeg0h99b7i45ooUKg41VPfQp8hVYoYQ==", + "dependencies": { + "archetype": "0.8.x", + "mongodb": "3.2.x" + } + }, + "node_modules/connect-mongodb-session/node_modules/mongodb": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.7.tgz", + "integrity": "sha512-2YdWrdf1PJgxcCrT1tWoL6nHuk6hCxhddAAaEh8QJL231ci4+P9FLyqopbTm2Z2sAU6mhCri+wd9r1hOcHdoMw==", + "dependencies": { + "mongodb-core": "3.2.7", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/connect-mongodb-session/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "node_modules/console-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/console-assert/-/console-assert-1.0.0.tgz", + "integrity": "sha1-cBZwKO8I7BZnoMaHIFqDYOsRc2c=", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "dev": true, + "dependencies": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" + } + }, + "node_modules/convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "node_modules/convert-to-spaces": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", + "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz", + "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==", + "dependencies": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/countries-list": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/countries-list/-/countries-list-2.5.0.tgz", + "integrity": "sha512-3WkdGv0Yd0UPNdndgW+gCkj+5oMRY5dcgrjNETPuEE0nmClFbFlllWwHw+sSR0CJrPtSQ3BvF8+0/6qIdf31iw==" + }, + "node_modules/cron": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", + "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", + "dev": true, + "dependencies": { + "moment-timezone": "^0.5.x" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/csrf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", + "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==", + "dependencies": { + "rndm": "1.2.0", + "tsscmp": "1.0.6", + "uid-safe": "2.1.5" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "engines": { + "node": "*" + } + }, + "node_modules/csurf": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.11.0.tgz", + "integrity": "sha512-UCtehyEExKTxgiu8UHdGvHj4tnpE/Qctue03Giq5gPgMQ9cg/ciod5blZQ5a4uCEenNQjxyGuzygLdKUmee/bQ==", + "dependencies": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "csrf": "3.1.0", + "http-errors": "~1.7.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/csurf/node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/csurf/node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/csurf/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, + "node_modules/data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dayjs": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", + "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "dependencies": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + } + }, + "node_modules/degenerator/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/del/node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "dependencies": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/dicer/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/dicer/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/dicer/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-prefetch-control": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", + "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dependencies": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + }, + "node_modules/domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "node_modules/domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "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/emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "dev": true, + "dependencies": { + "shimmer": "^1.2.0" + } + }, + "node_modules/emittery": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", + "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, + "node_modules/entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "node_modules/equal-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", + "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-regexp": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/escape-regexp/-/escape-regexp-0.0.1.tgz", + "integrity": "sha1-9EvaEtRbvfnLf4Yu5+SCez3TIlQ=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/eslint-config-standard": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-13.0.1.tgz", + "integrity": "sha512-zLKp4QOgq6JFgRm1dDCVv1Iu0P5uZ4v5Wa4DTOkg2RFMxdCX/9Qf7lz9ezRj2dBRa955cWQF/O/LWEiYWAHbTw==", + "dev": true + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "dev": true, + "dependencies": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-es": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", + "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", + "dev": true, + "dependencies": { + "eslint-utils": "^1.4.2", + "regexpp": "^2.0.1" + }, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/eslint-plugin-extra-rules": { + "version": "0.0.0-development", + "resolved": "https://registry.npmjs.org/eslint-plugin-extra-rules/-/eslint-plugin-extra-rules-0.0.0-development.tgz", + "integrity": "sha1-w8Gu0whsOf2Dwbek+j35iEtKu0g=", + "dev": true, + "dependencies": { + "console-assert": "1.0.0", + "espree": "3.0.0-alpha-1", + "quote": "0.4.0" + }, + "engines": { + "node": "> 0.10.*" + } + }, + "node_modules/eslint-plugin-extra-rules/node_modules/acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint-plugin-extra-rules/node_modules/acorn-jsx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-2.0.1.tgz", + "integrity": "sha1-Dt+YeKWGa8piX1KVWh7Z59jFEX4=", + "dev": true, + "dependencies": { + "acorn": "^2.0.1" + } + }, + "node_modules/eslint-plugin-extra-rules/node_modules/espree": { + "version": "3.0.0-alpha-1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.0.0-alpha-1.tgz", + "integrity": "sha1-yhOAvYHy+ulLJjiufMRJtx+R6qM=", + "dev": true, + "dependencies": { + "acorn": "^2.6.4", + "acorn-jsx": "^2.0.1" + }, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/eslint-plugin-node": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz", + "integrity": "sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^1.4.1", + "eslint-utils": "^1.4.2", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/eslint/node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "dev": true, + "dependencies": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "dependencies": { + "estraverse": "^4.0.0" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "dependencies": { + "estraverse": "^4.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=", + "dev": true + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect-ct": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", + "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-handlebars": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.1.0.tgz", + "integrity": "sha512-7QlaXnSREMmN5P2o4gmpUZDfJlLtfBka9d6r7/ccXaU7rPp76odw9YYtwZYdIiha2JqwiaG6o2Wu6NZJQ0u7Fg==", + "dependencies": { + "glob": "^7.1.3", + "graceful-fs": "^4.1.2", + "handlebars": "^4.1.2", + "object.assign": "^4.1.0", + "promise": "^8.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/express-rate-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.0.0.tgz", + "integrity": "sha512-dhT57wqxfqmkOi4HM7NuT4Gd7gbUgSK2ocG27Y6lwm8lbOAw9XQfeANawGq8wLDtlGPO1ZgDj0HmKsykTxfFAg==" + }, + "node_modules/express-session": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz", + "integrity": "sha512-t4oX2z7uoSqATbMfsxWMbNjAL0T5zpvcJCk3Z9wnPPN7ibddhnmDZXHfEcoBMG2ojKXZoCyPMc5FbtK+G7SoDg==", + "dependencies": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.0", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express-session/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express-session/node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express-session/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "node_modules/express/node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fclone": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", + "integrity": "sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=", + "dev": true + }, + "node_modules/feather-icons": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/feather-icons/-/feather-icons-4.25.0.tgz", + "integrity": "sha512-gIJbA4Kmzqub+eTwqA3LRJhC+G267t7QlvFxx+nnHYEEaCpXh5HwRY9pW39b51/Y8c7D9mjLplNdzGCWPz39Sg==", + "dependencies": { + "classnames": "^2.2.5", + "core-js": "^3.1.3" + } + }, + "node_modules/feather-icons/node_modules/core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + }, + "node_modules/feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", + "dev": true + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/frameguard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", + "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==", + "engines": { + "node": ">=4.0.0" + } + }, + "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-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "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==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-intrinsic/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-uri": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", + "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "~3.0.2", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "node_modules/glob": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "dependencies": { + "ini": "^1.3.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/got": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.6.0.tgz", + "integrity": "sha512-3LIdJNTdCFbbJc+h/EH0V5lpNpbJ6Bfwykk21lcQvQsEcrzdi/ltCyQehFHLzJ/ka0UMH4Slg0hkYvAZN9qUDg==", + "dependencies": { + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/got/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/got/node_modules/type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/gulp-less": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-4.0.1.tgz", + "integrity": "sha512-hmM2k0FfQp7Ptm3ZaqO2CkMX3hqpiIOn4OHtuSsCeFym63F7oWlEua5v6u1cIjVUKYsVIs9zPg9vbqTEb/udpA==", + "dependencies": { + "accord": "^0.29.0", + "less": "2.6.x || ^3.7.1", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "replace-ext": "^1.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/helmet": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", + "integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", + "dependencies": { + "depd": "2.0.0", + "dns-prefetch-control": "0.2.0", + "dont-sniff-mimetype": "1.1.0", + "expect-ct": "0.2.0", + "feature-policy": "0.3.0", + "frameguard": "3.1.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.9.4", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "ienoopen": "1.1.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-csp": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", + "integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", + "dependencies": { + "bowser": "^2.7.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "node_modules/hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "dependencies": { + "depd": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hsts/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dependencies": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "dependencies": { + "agent-base": "4", + "debug": "3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/https-proxy-agent/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/i18n": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.4.tgz", + "integrity": "sha512-PvMcG+yqYWXrwgdmCpL+APCGa8lRY0tdlo2cXp9UeR3u4h1bJGqFsgybfmG/MqtL1iDmdaPPPLJebXGrZ1XoMQ==", + "dependencies": { + "debug": "*", + "make-plural": "^6.0.1", + "math-interval-parser": "^2.0.1", + "messageformat": "^2.3.0", + "mustache": "*", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/i18n/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ienoopen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", + "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.0.0.tgz", + "integrity": "sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA==", + "dev": true, + "engines": { + "node": ">=10 <11 || >=12 <13 || >=14" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indx": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/inherits-ex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/inherits-ex/-/inherits-ex-1.2.3.tgz", + "integrity": "sha512-DCZqD7BpjXqaha8IKcoAE3ZZr6Hi12ropV1h+3pBnirE14mNRwLuYySvYxUSBemTQ40SjAxPL8BTk2Xw/3IF9w==", + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inquirer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.1.tgz", + "integrity": "sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/irregular-plurals": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.2.0.tgz", + "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "dependencies": { + "builtin-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "dev": true + }, + "node_modules/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, + "engines": { + "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.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, + "node_modules/is-natural-number-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number-string/-/is-natural-number-string-1.0.1.tgz", + "integrity": "sha1-0OvxwBH64tOwc02MgBFuJRKkoug=" + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "dependencies": { + "has": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/keyblade": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/keyblade/-/keyblade-0.3.2.tgz", + "integrity": "sha1-HmV/R3RlloB9a1kcU0dr6poawtQ=", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/keyv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", + "integrity": "sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazy": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", + "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/less": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "dependencies": { + "graceful-fs": "^4.1.2", + "mime": "^1.4.1", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "native-request": "^1.0.5" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-json-file/node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-json-file/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "node_modules/lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "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==" + }, + "node_modules/lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "node_modules/lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "node_modules/lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "node_modules/lodash.trim": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz", + "integrity": "sha1-NkJefukL5KpeJ7zruFt9EepHqlc=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/lodash.unset": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.unset/-/lodash.unset-4.5.2.tgz", + "integrity": "sha1-Nw0dPoW3Kn4bDN8tJyEhMG8j5O0=" + }, + "node_modules/lodash.without": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", + "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=" + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true, + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/lunr": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.8.tgz", + "integrity": "sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-plural": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.0.1.tgz", + "integrity": "sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ==" + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-interval-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", + "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mem": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-6.1.1.tgz", + "integrity": "sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mem/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/messageformat": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", + "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", + "dependencies": { + "make-plural": "^4.3.0", + "messageformat-formatters": "^2.0.1", + "messageformat-parser": "^4.1.2" + } + }, + "node_modules/messageformat-formatters": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", + "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==" + }, + "node_modules/messageformat-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.2.tgz", + "integrity": "sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA==" + }, + "node_modules/messageformat/node_modules/make-plural": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", + "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", + "bin": { + "make-plural": "bin/make-plural" + }, + "optionalDependencies": { + "minimist": "^1.2.0" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "bin": { + "mime": "cli.js" + } + }, + "node_modules/mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/mime-type/-/mime-type-3.0.7.tgz", + "integrity": "sha512-NyWtbAKERuLQIv+1jjEdWGrWepVlubZEW0fTs4K9T6UWW45iMBpgrwpP5GIl8/5trHLviOcQfA6zEth3T8WhNA==", + "dependencies": { + "media-typer": "^0.3.0", + "minimatch": "^3.0.4", + "path.js": "^1.0.7", + "util-ex": "^0.3.15" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "dependencies": { + "mime-db": "~1.37.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=", + "dev": true + }, + "node_modules/moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "dev": true, + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.3.tgz", + "integrity": "sha512-MdRnoOjstmnrKJsK8PY0PjP6fyF/SBS4R8coxmhsfEU7tQ46/J6j+aSHF2n4c2/H8B+Hc/Klbfp8vggZfI0mmA==", + "dependencies": { + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + } + }, + "node_modules/mongodb-core": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.7.tgz", + "integrity": "sha512-WypKdLxFNPOH/Jy6i9z47IjG2wIldA54iDZBmHMINcgKOUcWJh8og+Wix76oGd7EyYkHJKssQ2FAOw5Su/n4XQ==", + "dependencies": { + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + } + }, + "node_modules/mongodb-core/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "node_modules/mongodb-uri": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/mongodb-uri/-/mongodb-uri-0.9.7.tgz", + "integrity": "sha1-D3ca0W9IOuZfQoeWlCjp+8SqYYE=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/mongodb/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "node_modules/morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "dependencies": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/mpath": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.1.tgz", + "integrity": "sha512-H8OVQ+QEz82sch4wbODFOz+3YQ61FYz/z3eJ5pIdbMEaUzDqA268Wd+Vt4Paw9TJfvDgVKaayC0gBzMIw2jhsg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/multer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", + "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mustache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.1.0.tgz", + "integrity": "sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ==", + "bin": { + "mustache": "bin/mustache" + }, + "engines": { + "npm": ">=1.4.0" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/native-request": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", + "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==", + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/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==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/node-abi": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", + "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", + "dependencies": { + "semver": "^5.4.1" + } + }, + "node_modules/node-addon-api": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.1.0.tgz", + "integrity": "sha512-Zz1o1BDX2VtduiAt6kgiUl8jX1Vm3NMboljFYKQJ6ee8AGfiTvM2mlZFI3xPbqjs80rCQgiVJI/DjQ/1QJ0HwA==" + }, + "node_modules/node-cron": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", + "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==", + "dependencies": { + "opencollective-postinstall": "^2.0.0", + "tz-offset": "0.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemailer": { + "version": "6.4.16", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.16.tgz", + "integrity": "sha512-68K0LgZ6hmZ7PVmwL78gzNdjpj5viqBdFqKrTtr9bZbJYj6BRj5W6WGkxXrEnUl3Co3CBXi3CZBUlpV/foGnOQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/nssocket": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", + "integrity": "sha1-Wflvb/MhVm8zxw99vu7N/cBxVPo=", + "dev": true, + "dependencies": { + "eventemitter2": "~0.4.14", + "lazy": "~1.0.11" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/nssocket/node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "node_modules/nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.1.tgz", + "integrity": "sha512-HgcGMooY4JC2PBt9sdUdJ6PMzpin+YtY3r/7wg0uTifP+HJWW8rammseSEHuyt0UeShI183UGssCJqm1bJR7QA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", + "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", + "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", + "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", + "dev": true, + "dependencies": { + "agent-base": "^4.2.0", + "debug": "^4.1.1", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^4.0.1" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/pac-proxy-agent/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==", + "dev": true + }, + "node_modules/pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/package-json/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/package-json/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/package-json/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/package-json/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/package-json/node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "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/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path.js": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path.js/-/path.js-1.0.7.tgz", + "integrity": "sha1-fRNrYH3hm/2YugaIdJJih+ZTSTk=", + "dependencies": { + "escape-string-regexp": "^1.0.3", + "inherits-ex": "^1.1.2", + "util-ex": "^0.3.10" + } + }, + "node_modules/paypal-rest-sdk": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/paypal-rest-sdk/-/paypal-rest-sdk-1.8.1.tgz", + "integrity": "sha512-Trj2GuPn10GqpICAxQh5wjxuDT7rq7DMOkvyatz05wI5xPGmqXN7UC0WfDSF9WSBs4YdcWZP0g+nY+sOdaFggw==", + "dependencies": { + "buffer-crc32": "^0.2.3", + "semver": "^5.0.3" + }, + "engines": { + "node": ">= v0.6.0" + } + }, + "node_modules/picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pidusage/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "dev": true, + "dependencies": { + "irregular-plurals": "^3.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-4.5.0.tgz", + "integrity": "sha512-sXKn0Qsrqj++qgsdGTASEsWfURhM6vSPIqFPwSwk3bK5/QPLxuRmVDW1y82M9wEnlgEjiIryaLhZUp5saLuhPA==", + "dev": true, + "dependencies": { + "@pm2/agent": "~1.0.2", + "@pm2/io": "~4.3.5", + "@pm2/js-api": "~0.6.0", + "@pm2/pm2-version-check": "^1.0.3", + "async": "~3.2.0", + "blessed": "0.1.81", + "chalk": "3.0.0", + "chokidar": "^3.3.0", + "cli-tableau": "^2.0.0", + "commander": "2.15.1", + "cron": "1.8.2", + "dayjs": "~1.8.25", + "debug": "^4.2.0", + "enquirer": "2.3.6", + "eventemitter2": "5.0.1", + "fclone": "1.0.11", + "mkdirp": "1.0.4", + "needle": "2.4.0", + "pidusage": "2.0.21", + "pm2-axon": "4.0.0", + "pm2-axon-rpc": "0.6.0", + "pm2-deploy": "~1.0.2", + "pm2-multimeter": "^0.1.2", + "promptly": "^2", + "ps-list": "6.3.0", + "semver": "^7.2", + "source-map-support": "0.5.19", + "sprintf-js": "1.1.2", + "vizion": "0.2.13", + "yamljs": "0.3.0" + }, + "bin": { + "pm2": "bin/pm2", + "pm2-dev": "bin/pm2-dev", + "pm2-docker": "bin/pm2-docker", + "pm2-runtime": "bin/pm2-runtime" + }, + "engines": { + "node": ">=8.10.0" + }, + "optionalDependencies": { + "systeminformation": "^4.23.3" + } + }, + "node_modules/pm2-axon": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.0.tgz", + "integrity": "sha512-A8dy0C57cRIm+kX58HrMcnvUdg8EdwCuCmavDdmFE4eoUE+5zfwGbDfZKCBVLNpDwjXPuXQQYZi3wQt/5xC8DQ==", + "dev": true, + "dependencies": { + "amp": "~0.3.1", + "amp-message": "~0.1.1", + "debug": "^4.2", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-axon-rpc": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.6.0.tgz", + "integrity": "sha512-xjYR0y1HpOopJ09VL2Qd5H1LajVN+QLPVZ1G+GesbORJDAZiStMhwECtOzm/Gx5ANQxL0usW8WZsElMfQq2hbw==", + "dev": true, + "dependencies": { + "debug": "^3.0" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-axon-rpc/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/pm2-axon-rpc/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==", + "dev": true + }, + "node_modules/pm2-axon/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/pm2-axon/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2-axon/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==", + "dev": true + }, + "node_modules/pm2-deploy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", + "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", + "dev": true, + "dependencies": { + "run-series": "^1.1.8", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pm2-multimeter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", + "integrity": "sha1-Gh5VFT1BoFU0zqI8/oYKuqDrSs4=", + "dev": true, + "dependencies": { + "charm": "~0.1.1" + } + }, + "node_modules/pm2/node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "node_modules/pm2/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pm2/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/pm2/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/pm2/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2/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==", + "dev": true + }, + "node_modules/pm2/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.14.tgz", + "integrity": "sha512-+jD0ZijcvyCqPQo/m/CW0UcARpdFylq04of+Q7RKX6f/Tu+dvpUI/9Sp81+i6/vJThnOBX09Quw0ZLOVwpzX3w==", + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", + "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "dependencies": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.21.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", + "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promptly": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", + "integrity": "sha1-KhP6BjaIoqWYOxYf/wEIoH0m/HQ=", + "dev": true, + "dependencies": { + "read": "^1.0.4" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", + "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", + "dev": true, + "dependencies": { + "agent-base": "^4.2.0", + "debug": "4", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^3.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/proxy-agent/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==", + "dev": true + }, + "node_modules/proxy-agent/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "optional": true + }, + "node_modules/ps-list": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-6.3.0.tgz", + "integrity": "sha512-qau0czUSB0fzSlBOQt0bo+I2v6R+xiQdj78e1BR/Qjfl5OHWJ/urXi8+ilw1eHe+5hSeDI1wrwVTgDp2wst4oA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/quote": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/quote/-/quote-0.4.0.tgz", + "integrity": "sha1-EIOSF/bBNiuJGUBE0psjP9fzLwE=", + "dev": true + }, + "node_modules/rand-token": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/rand-token/-/rand-token-0.4.0.tgz", + "integrity": "sha512-FLNNsir2R+XY8LKsZ+8u/w0qZ4sGit7cpNdznsI77cAVob6UlVPueDKRyjJ3W1Q6FJLgAVH98JvlqqpSaL7NEQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ranges-apply": { + "version": "3.0.48", + "resolved": "https://registry.npmjs.org/ranges-apply/-/ranges-apply-3.0.48.tgz", + "integrity": "sha512-BnNKJGVJ70290B/h9dekLqZAqpA5zziUao5J93Zm0o/+x55ZoN+Sx2DIIGgnvNQ5e8W2kN7CvM6k5mBMxLWnxQ==", + "dependencies": { + "is-natural-number-string": "^1.0.1", + "ranges-merge": "^4.2.31" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/ranges-merge": { + "version": "4.2.31", + "resolved": "https://registry.npmjs.org/ranges-merge/-/ranges-merge-4.2.31.tgz", + "integrity": "sha512-YCoKrdj5juCPNoFipewrf/agmEXulgEkzcLhsUhlcZXZ5uMsVOdbRJNVdkPlZvvkqiKkzCNjrUYk2Yl3DHVmew==", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lodash.isplainobject": "^4.0.6", + "ranges-sort": "^3.10.46" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/ranges-push": { + "version": "3.6.15", + "resolved": "https://registry.npmjs.org/ranges-push/-/ranges-push-3.6.15.tgz", + "integrity": "sha512-i1uEcKCgyUs8JMNn363bREAChUoDeUZgg6eMjvKa8ay7G7Veh7qhEUb8taetcQ3V93FE4ubLk/MHcSuTvPtzTg==", + "dependencies": { + "is-natural-number-string": "^1.0.1", + "lodash.clonedeep": "^4.5.0", + "ranges-merge": "^4.2.31", + "string-collapse-leading-whitespace": "^2.0.12", + "string-trim-spaces-only": "^2.8.9" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/ranges-sort": { + "version": "3.10.46", + "resolved": "https://registry.npmjs.org/ranges-sort/-/ranges-sort-3.10.46.tgz", + "integrity": "sha512-H07aLdjKQRz3tUNHCj5P9Tof1vH35J4c3atXl8T/fs3SATKgzpkjACz9MfuuKgvQsXOFau2GDvQ/hl6Szw39/Q==", + "dependencies": { + "is-natural-number": "^4.0.1" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "dependencies": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.0.3.tgz", + "integrity": "sha512-p/ICV8uMlqC4tjOYabLMxAWCIKa0YUQgZZ6KDM0xgXJNgdGQ1WmL2A07TwmrZw+wi6ITUFKzH5v3n+ENEyXVkA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, + "node_modules/require-in-the-middle/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/require-in-the-middle/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==", + "dev": true + }, + "node_modules/require-in-the-middle/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rndm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" + }, + "node_modules/run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "dependencies": { + "is-promise": "^2.1.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "node_modules/run-series": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.8.tgz", + "integrity": "sha512-+GztYEPRpIsQoCSraWHDBs9WVy4eVME16zhOtDB4H9J4xN0XRhknnmLOl+4gRgZtu8dpp9N/utSPjKH/xmDzXg==", + "dev": true + }, + "node_modules/rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sanitize-html": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.3.2.tgz", + "integrity": "sha512-p7neuskvC8pSurUjdVmbWPXmc9A4+QpOXIL+4gwFC+av5h+lYCXFT8uEneqsFQg/wEA1IH+cKQA60AaQI6p3cg==", + "dependencies": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^6.0.0", + "is-plain-object": "^5.0.0", + "klona": "^2.0.3", + "parse-srcset": "^1.0.2", + "postcss": "^8.0.2" + } + }, + "node_modules/sanitize-html/node_modules/dom-serializer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz", + "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/sanitize-html/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "node_modules/sanitize-html/node_modules/domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/sanitize-html/node_modules/domutils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.6.0.tgz", + "integrity": "sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/sanitize-html/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "node_modules/sanitize-html/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/sanitize-html/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sharp": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.29.0.tgz", + "integrity": "sha512-mdN1Up0eN+SwyForPls59dWO0nx64J1XRQYy5ZiKSADAccGYCB10UAGJHSVG9VObzJdhHqrVJzQcq6gx8USyoA==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.0.1", + "detect-libc": "^1.0.3", + "node-addon-api": "^4.0.0", + "prebuild-install": "^6.1.4", + "semver": "^7.3.5", + "simple-get": "^3.1.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "dev": true + }, + "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==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sitemap": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-1.13.0.tgz", + "integrity": "sha1-Vpy+IYAgKSamKiZs094Jyc60P4M=", + "dependencies": { + "underscore": "^1.7.0", + "url-join": "^1.1.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "dependencies": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "dependencies": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "dependencies": { + "spdx-license-ids": "^1.0.2" + } + }, + "node_modules/spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "node_modules/spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/standard-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz", + "integrity": "sha1-I+UWj6HAggGJ5YEnAaeQWFENDTQ=" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-collapse-leading-whitespace": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-2.0.12.tgz", + "integrity": "sha512-LQoIozpzquQCxt3ARdnuPAp0IFcQFfMgVKDVMYpvmrfyUSA17pLuSOD8h3HfYJNn0uTnw0eb5xsiIPTyzlzxCw==", + "engines": { + "node": ">=8.9" + } + }, + "node_modules/string-left-right": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/string-left-right/-/string-left-right-2.3.14.tgz", + "integrity": "sha512-Z6/TNpG+aDijZyO0K32dPOI0d8R2uzXWhiibGMj+AZIqOBUY0BJnZ96OSNYQohSuABfZRu03POo/3rEhrxfLZw==", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lodash.isplainobject": "^4.0.6" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/string-strip-html": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/string-strip-html/-/string-strip-html-4.3.14.tgz", + "integrity": "sha512-CpX4dR8388T5HwYMKqS17K3MGls0yuec7m5hK6hbWGvxpJPVXJIfMd+ZTCHLgHVoWZew6sjBqI6bpERol/tGxw==", + "dependencies": { + "ent": "^2.2.0", + "lodash.isplainobject": "^4.0.6", + "lodash.trim": "^4.5.1", + "lodash.without": "^4.4.0", + "ranges-apply": "^3.0.48", + "ranges-push": "^3.6.15", + "string-left-right": "^2.3.14" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/string-trim-spaces-only": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/string-trim-spaces-only/-/string-trim-spaces-only-2.8.9.tgz", + "integrity": "sha512-atfGwUCChsXQ0WEqX1Ju2YYC/6yqpnq8fL8jl2BUpjNR13b+s6q/SmmdDG10H+t4JB8/cRi9klyYuwctvgjFJg==", + "engines": { + "node": ">=8.9" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stripe": { + "version": "8.170.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-8.170.0.tgz", + "integrity": "sha512-1fM9K+WHCHIGAurcf5UYqqUP7LRR+FBcjx4JA+MoH4YqH6/Bi2Xm50O0lMbf3C/iuUg+tuGlFzeqVBsnqIZuEA==", + "dependencies": { + "@types/node": ">=8.1.0", + "qs": "^6.6.0" + }, + "engines": { + "node": "^8.1 || >=10.*" + } + }, + "node_modules/stripe/node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/supertap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-1.0.0.tgz", + "integrity": "sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "indent-string": "^3.2.0", + "js-yaml": "^3.10.0", + "serialize-error": "^2.1.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supertap/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supertap/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supertap/node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supertap/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supertest": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", + "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^3.8.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/supertest/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/supertest/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==", + "dev": true + }, + "node_modules/supertest/node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/supertest/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/supertest/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/supertest/node_modules/superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/systeminformation": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.34.9.tgz", + "integrity": "sha512-jvc4DlJeXazsen2riPDR97GSaHNCmoL+mgfB8IXxmpNpNd7kv5MfkuihXEmF1/prBFtqzUA2lxnt1qp4maOMQA==", + "dev": true, + "optional": true, + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dependencies": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "node_modules/thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-readable-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dependencies": { + "mime-db": "1.40.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/tz-offset": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", + "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" + }, + "node_modules/uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "dependencies": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-es/node_modules/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", + "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "node_modules/uglifycss": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/uglifycss/-/uglifycss-0.0.27.tgz", + "integrity": "sha1-U1U7gRXeJtzle0K6CzTojdgNDN4=", + "bin": { + "uglifycss": "uglifycss" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", + "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=" + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util-ex": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/util-ex/-/util-ex-0.3.15.tgz", + "integrity": "sha1-+SYc2hPEMn0HQMvme+Eife2LAFg=", + "dependencies": { + "inherits-ex": "^1.1.2", + "xtend": "^4.0.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "dependencies": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vizion": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/vizion/-/vizion-0.2.13.tgz", + "integrity": "sha1-ExTN7is0EW+fWxJIU2+V2/zW718=", + "dev": true, + "dependencies": { + "async": "1.5" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/vizion/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" + }, + "node_modules/which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "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" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "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/yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + }, + "bin": { + "json2yaml": "bin/json2yaml", + "yaml2json": "bin/yaml2json" + } + }, + "node_modules/yargs": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz", + "integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.0", + "escalade": "^3.0.2", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.1", + "yargs-parser": "^20.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yenv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yenv/-/yenv-2.1.1.tgz", + "integrity": "sha512-fbjRZjpP9fi1Kdj8ehSXNf703qYCoeb80QoEwnPDjogy5abE1raxXJfr+wJLn6mFRcvp1pfyHfYg0N40y8MBCA==", + "dependencies": { + "coercer": "^1.1.2", + "deep-extend": "^0.6.0", + "js-yaml": "^3.13.1", + "keyblade": "^0.3.2", + "yargs": "^14.2.0" + }, + "bin": { + "yenv": "bin/yenv" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/yenv/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yenv/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yenv/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/yenv/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/yenv/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yenv/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yenv/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yenv/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yenv/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yenv/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/yenv/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yenv/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yenv/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/yenv/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yenv/node_modules/yargs": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz", + "integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==", + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.0" + } + }, + "node_modules/yenv/node_modules/yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + }, "dependencies": { "@adyen/api-library": { "version": "2.1.7", @@ -749,12 +10464,6 @@ "requires": { "color-name": "~1.1.4" } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -771,14 +10480,6 @@ "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } } }, "append-field": { @@ -786,6 +10487,11 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "archetype": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/archetype/-/archetype-0.8.8.tgz", @@ -798,6 +10504,15 @@ "standard-error": "1.1.0" } }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1006,12 +10721,6 @@ "color-name": "~1.1.4" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -1045,12 +10754,6 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "dev": true }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1101,6 +10804,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -1127,6 +10835,46 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "blessed": { "version": "0.1.81", "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", @@ -1156,34 +10904,10 @@ "type-is": "~1.6.17" }, "dependencies": { - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - }, - "dependencies": { - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - } - } - }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } } } }, @@ -1254,6 +10978,15 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -1343,15 +11076,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } } } }, @@ -1471,6 +11195,11 @@ "readdirp": "~3.4.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -1639,11 +11368,35 @@ "convert-to-spaces": "^1.0.1" } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "coercer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/coercer/-/coercer-1.1.2.tgz", "integrity": "sha1-6upEWVEfc/nzat4EqYEHznWCS3A=" }, + "color": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/color/-/color-4.0.1.tgz", + "integrity": "sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.6.0" + }, + "dependencies": { + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + } + } + }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", @@ -1653,9 +11406,18 @@ } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "colorette": { "version": "1.2.2", @@ -1772,6 +11534,11 @@ "integrity": "sha1-cBZwKO8I7BZnoMaHIFqDYOsRc2c=", "dev": true }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", @@ -2087,6 +11854,11 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2097,6 +11869,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "dicer": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", @@ -2904,6 +12681,11 @@ "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=", "dev": true }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, "expect-ct": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", @@ -2951,21 +12733,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - }, - "dependencies": { - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - } - } - }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -2975,15 +12742,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } } } }, @@ -3083,30 +12841,6 @@ "picomatch": "^2.2.1" }, "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -3122,15 +12856,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, @@ -3303,6 +13028,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3351,22 +13081,69 @@ } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "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 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.1", @@ -3408,6 +13185,11 @@ "readable-stream": "2" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, "glob": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", @@ -3488,15 +13270,6 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "type-fest": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", @@ -3554,6 +13327,11 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -3744,6 +13522,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ienoopen": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", @@ -3843,8 +13626,7 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inquirer": { "version": "7.0.1", @@ -3867,40 +13649,6 @@ "through": "^2.3.6" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "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 - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -4472,6 +14220,14 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "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" + } + }, "lunr": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.8.tgz", @@ -4596,12 +14352,6 @@ "requires": { "minimist": "^1.2.0" } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "optional": true } } }, @@ -4688,15 +14438,13 @@ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - } } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "module-details-from-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", @@ -4768,13 +14516,6 @@ "depd": "~1.1.2", "on-finished": "~2.3.0", "on-headers": "~1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - } } }, "mpath": { @@ -4818,6 +14559,11 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==" }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "native-request": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", @@ -4885,6 +14631,19 @@ "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" }, + "node-abi": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", + "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", + "requires": { + "semver": "^5.4.1" + } + }, + "node-addon-api": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.1.0.tgz", + "integrity": "sha512-Zz1o1BDX2VtduiAt6kgiUl8jX1Vm3NMboljFYKQJ6ee8AGfiTvM2mlZFI3xPbqjs80rCQgiVJI/DjQ/1QJ0HwA==" + }, "node-cron": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", @@ -4922,6 +14681,17 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nssocket": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", @@ -4948,6 +14718,11 @@ "boolbase": "~1.0.0" } }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "numeral": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", @@ -5601,21 +15376,6 @@ "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", "dev": true }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -5626,22 +15386,6 @@ "supports-color": "^7.1.0" } }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", @@ -5657,37 +15401,6 @@ "ms": "2.1.2" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -5700,57 +15413,17 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, @@ -5844,6 +15517,26 @@ "source-map": "^0.6.1" } }, + "prebuild-install": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", + "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.21.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -5972,7 +15665,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6073,20 +15765,11 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "read": { @@ -6221,6 +15904,15 @@ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6263,15 +15955,6 @@ } } }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", @@ -6559,6 +16242,31 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "sharp": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.29.0.tgz", + "integrity": "sha512-mdN1Up0eN+SwyForPls59dWO0nx64J1XRQYy5ZiKSADAccGYCB10UAGJHSVG9VObzJdhHqrVJzQcq6gx8USyoA==", + "requires": { + "color": "^4.0.1", + "detect-libc": "^1.0.3", + "node-addon-api": "^4.0.0", + "prebuild-install": "^6.1.4", + "semver": "^7.3.5", + "simple-get": "^3.1.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -6593,8 +16301,47 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } }, "sitemap": { "version": "1.13.0", @@ -6758,6 +16505,14 @@ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-collapse-leading-whitespace": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-2.0.12.tgz", @@ -6802,14 +16557,6 @@ "strip-ansi": "^6.0.0" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -6827,8 +16574,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "stripe": { "version": "8.170.0", @@ -7042,6 +16788,54 @@ } } }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -7131,6 +16925,14 @@ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "tv4": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", @@ -7419,6 +17221,43 @@ "isexe": "^2.0.0" } }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -7522,6 +17361,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yamljs": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", @@ -7609,11 +17453,6 @@ "locate-path": "^3.0.0" } }, - "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==" - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", diff --git a/package.json b/package.json index 73561b26..63601ae4 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ } }, "engines": { - "node": "10.16.0" + "node": ">=10.16.0 <0.15" }, "dependencies": { "@adyen/api-library": "^2.1.7", @@ -70,6 +70,7 @@ "rand-token": "^0.4.0", "rimraf": "^2.7.1", "sanitize-html": "^2.3.2", + "sharp": "^0.29.0", "sitemap": "^1.6.0", "string-strip-html": "^4.3.14", "strip-bom": "^3.0.0", diff --git a/routes/admin.js b/routes/admin.js index d16f592b..adddef6f 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -35,6 +35,7 @@ const { deleteMenu, orderMenu } = require('../lib/menu'); +const sharp = require("sharp"); const ObjectId = require('mongodb').ObjectID; const router = express.Router(); const csrfProtection = csrf({ cookie: true }); @@ -672,15 +673,22 @@ router.post('/admin/file/upload', restrict, checkAccess, upload.single('uploadFi const productPath = product._id.toString(); const uploadDir = path.join('public/uploads', productPath); + const thumbnailDir = path.join('public/uploads', productPath,"thumbnails"); + // Check directory and create (if needed) checkDirectorySync(uploadDir); + checkDirectorySync(thumbnailDir); + + const imagePath = path.join('/uploads', productPath, file.originalname); + const thumbnailPath = path.join('/uploads', productPath,"thumbnails"); + // Setup the new path - const imagePath = path.join('/uploads', productPath, file.originalname.replace(/ /g, '_')); + const sanitizedFileName = file.originalname.replace(/ /g, '_'); // save the new file - const dest = fs.createWriteStream(path.join(uploadDir, file.originalname.replace(/ /g, '_'))); + const dest = fs.createWriteStream(path.join(uploadDir, sanitizedFileName)); const pipeline = util.promisify(stream.pipeline); try{ @@ -688,13 +696,19 @@ router.post('/admin/file/upload', restrict, checkAccess, upload.single('uploadFi fs.createReadStream(file.path), dest ); + //resize image for thumbnails + await sharp(file.path) + .resize(500,375) + .jpeg({ mozjpeg: true }) + .toFile(path.join(thumbnailDir,sanitizedFileName)); + // delete the temp file. fs.unlinkSync(file.path); // if there isn't a product featured image, set this one if(!product.productImage){ - await db.products.updateOne({ _id: getId(req.body.productId) }, { $set: { productImage: imagePath } }, { multi: false }); + await db.products.updateOne({ _id: getId(req.body.productId) }, { $set: { productImage: imagePath, productThumbnail : thumbnailPath } }, { multi: false }); } res.status(200).json({ message: 'File uploaded successfully' }); }catch(ex){ diff --git a/views/themes/Cloth/index.hbs b/views/themes/Cloth/index.hbs index ad1e1039..49b6f3bf 100644 --- a/views/themes/Cloth/index.hbs +++ b/views/themes/Cloth/index.hbs @@ -22,11 +22,15 @@ From 2a35b3ef8e93355d139d1e63036f062b878effb9 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 30 Aug 2021 05:11:00 +0300 Subject: [PATCH 44/79] sharp is not compatible with node versions below 12.13.0 Signed-off-by: nick --- .github/workflows/tests.yaml | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index c9c4839a..95811dd8 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [10.x, 12.x, 13.x, 14.x] + node-version: [12.x, 13.x, 14.x] mongodb-version: [4.2] steps: - uses: actions/checkout@v2 @@ -27,4 +27,4 @@ jobs: run: npm run test env: test: true - CI: true \ No newline at end of file + CI: true diff --git a/package.json b/package.json index 63601ae4..de33ac93 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ } }, "engines": { - "node": ">=10.16.0 <0.15" + "node": ">=12.13.0 <0.15" }, "dependencies": { "@adyen/api-library": "^2.1.7", From 6b21ecb17c29aad763310e7ffdb4517fbe5fac17 Mon Sep 17 00:00:00 2001 From: nick Date: Wed, 1 Sep 2021 13:45:14 +0300 Subject: [PATCH 45/79] send right variants Signed-off-by: nick --- routes/product.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/product.js b/routes/product.js index f6433ecc..0874d90d 100644 --- a/routes/product.js +++ b/routes/product.js @@ -228,7 +228,7 @@ router.post('/admin/product/addvariant', restrict, checkAccess, async (req, res) try{ const variant = await db.variants.insertOne(variantDoc); product.variants = variant.ops; - const productWithNewVariant = {...product, productVariants : [variant]}; + const productWithNewVariant = {...product, productVariants : variant.ops}; hooker.emit("variant_onCreate",productWithNewVariant); From e205ed81647f499322b090f52c18c942d70d0a9c Mon Sep 17 00:00:00 2001 From: nick Date: Wed, 1 Sep 2021 21:23:01 +0300 Subject: [PATCH 46/79] fixed types possiblke for variants Signed-off-by: nick --- config/settings.json | 5 ++- config/settingsSchema.json | 14 ++++++++ lib/config.js | 8 +++-- lib/schemas/newVariant.json | 5 ++- locales/en.json | 7 +++- locales/it.json | 3 +- locales/ro.json | 9 +++-- public/javascripts/admin.js | 20 +++++++++++ routes/index.js | 2 +- routes/product.js | 10 +++++- views/layouts/layout.hbs | 1 + views/partials/variantPredefinedModal.hbs | 41 +++++++++++++++++++++++ views/product-edit.hbs | 1 + views/product-new.hbs | 7 ++-- views/themes/Cloth/product.hbs | 1 + 15 files changed, 119 insertions(+), 15 deletions(-) create mode 100644 views/partials/variantPredefinedModal.hbs diff --git a/config/settings.json b/config/settings.json index b9cd0681..bf434228 100644 --- a/config/settings.json +++ b/config/settings.json @@ -60,5 +60,8 @@ } }, "showRelatedProducts": true, - "showHomepageVariants": false + "showHomepageVariants": false, + "variantTemplates" : [{ + "color" : ["black","white","red"] + }] } diff --git a/config/settingsSchema.json b/config/settingsSchema.json index b296333f..c7692dd9 100644 --- a/config/settingsSchema.json +++ b/config/settingsSchema.json @@ -217,6 +217,20 @@ "showHomepageVariants": { "type": "boolean", "default": false + }, + "variantTemplates" : { + "type": "array", + "items" : { + "type" : "object", + "patternProperties" : { + ".*" : { + "type" : "array", + "items" : { + "type" : "string" + } + } + } + } } }, "required": [ diff --git a/lib/config.js b/lib/config.js index d80e9b1e..701aef03 100644 --- a/lib/config.js +++ b/lib/config.js @@ -3,9 +3,10 @@ const escape = require('html-entities').AllHtmlEntities; const fs = require('fs'); const path = require('path'); const _ = require('lodash'); +let config; const getConfig = () => { - let config = JSON.parse(fs.readFileSync(path.join(__dirname, '../config', 'settings.json'), 'utf8')); + config = JSON.parse(fs.readFileSync(path.join(__dirname, '../config', 'settings.json'), 'utf8')); const localConfigFilePath = path.join(__dirname, '../config', 'settings-local.json'); // Check for local config file and merge with base settings @@ -166,9 +167,12 @@ const updateConfigLocal = (field) => { } }; +const getNonDefaultLanguages = () => config.availableLanguages.filter( x => x !== config.defaultLocale); + module.exports = { getConfig, getPaymentConfig, updateConfig, - updateConfigLocal + updateConfigLocal, + getNonDefaultLanguages }; diff --git a/lib/schemas/newVariant.json b/lib/schemas/newVariant.json index 303aa306..3b16742b 100644 --- a/lib/schemas/newVariant.json +++ b/lib/schemas/newVariant.json @@ -17,6 +17,9 @@ }, "stock": { "type": ["number", "null"] + }, + "type" : { + "type": "string" } }, "errorMessage": { @@ -31,4 +34,4 @@ "price", "stock" ] -} \ No newline at end of file +} diff --git a/locales/en.json b/locales/en.json index 976e81b5..103c3cc5 100644 --- a/locales/en.json +++ b/locales/en.json @@ -250,5 +250,10 @@ "Payment": "Payment", "Create an account": "Create an account", "Return to cart": "Return to cart", - "Continue to shipping": "Continue to shipping" + "Continue to shipping": "Continue to shipping", + "Add Color": "Add Color", + "black": "black", + "white": "white", + "red": "red", + "Add variant": "Add variant" } \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index ae5c42b4..4f38ad82 100644 --- a/locales/it.json +++ b/locales/it.json @@ -204,5 +204,6 @@ "Price": "Price", "Stock": "Stock", "Save variant": "Save variant", - "View": "View" + "View": "View", + "white": "white" } \ No newline at end of file diff --git a/locales/ro.json b/locales/ro.json index cb6bfabd..e24fd880 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -246,5 +246,10 @@ "Save variant": "Salvează varianta", "Home": "Acasă", "Manage": "Gestionați", - "FREE shipping": "Livrare GRATUITĂ" -} + "FREE shipping": "Livrare GRATUITĂ", + "white": "alb", + "black": "black", + "red": "red", + "Add variant": "Add variant", + "Add Color": "Add Color" +} \ No newline at end of file diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index babcd98e..51e2fa80 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -76,6 +76,26 @@ $(document).ready(function (){ $('#variant-edit-stock').val($(e.relatedTarget).data('stock')); }); + $(document).on('click', '#addVariantFromTemplate', function(e){ + $.ajax({ + method: 'POST', + url: '/admin/product/addvariant', + data: { + product: $('#variant-product').val(), + title: $('#chooseVariant-template').val(), + price: $('#variant-price-template').val(), + stock: $('#variant-stock-template').val(), + type: $ ('#variant-title-template').val(), + } + }) + .done(function(msg){ + showNotification(msg.message, 'success', true); + }) + .fail(function(msg){ + showNotification(msg.responseJSON.message, 'danger'); + }); + }); + $(document).on('click', '#addVariant', function(e){ const varfields = allLanguages.reduce((acc,x) => { acc[`variantTitle_${x}`] = $(`#variant-title_${x}`).val(); diff --git a/routes/index.js b/routes/index.js index 48e0a8f9..ae49e7b1 100644 --- a/routes/index.js +++ b/routes/index.js @@ -422,7 +422,7 @@ router.get('/product/:id', async (req, res) => { let variants = await db.variants.find({ product: product._id }).sort({ added: 1 }).toArray(); variants = variants.map(x => { - x.title = req.cookies.locale !== req.app.config.defaultLocale ? x[`title_${req.cookies.locale}`] : x.title; + x.title = (req.cookies.locale && req.cookies.locale !== req.app.config.defaultLocale) ? x[`title_${req.cookies.locale}`] ? x[`title_${req.cookies.locale}`] : x.title : x.title return x; }); diff --git a/routes/product.js b/routes/product.js index 0874d90d..1040813d 100644 --- a/routes/product.js +++ b/routes/product.js @@ -12,6 +12,7 @@ const { const { indexProducts } = require('../lib/indexing'); const { validateJson } = require('../lib/schema'); const { paginateData } = require('../lib/paginate'); +const {getNonDefaultLanguages} = require('../lib/config'); const colors = require('colors'); const rimraf = require('rimraf'); const fs = require('fs'); @@ -194,14 +195,21 @@ router.get('/admin/product/edit/:id', restrict, checkAccess, async (req, res) => // Add a variant to a product router.post('/admin/product/addvariant', restrict, checkAccess, async (req, res) => { const db = req.app.db; + const languages = getNonDefaultLanguages().reduce((acc,x) => { + acc[`title_${x}`] = req.__({phrase :req.body.title,locale : x}); + return acc + },{}) const variantDoc = { product: req.body.product, title: req.body.title, price: req.body.price, - stock: safeParseInt(req.body.stock) || null + stock: safeParseInt(req.body.stock) || null, + type: req.body.type, + ...languages }; + // Validate the body again schema const schemaValidate = validateJson('newVariant', variantDoc); if(!schemaValidate.result){ diff --git a/views/layouts/layout.hbs b/views/layouts/layout.hbs index 92e8dda3..03b76af8 100644 --- a/views/layouts/layout.hbs +++ b/views/layouts/layout.hbs @@ -289,6 +289,7 @@ {{> partials/globalSearchModal}} {{> partials/validationModal}} {{> partials/variantModal}} + {{> partials/variantPredefinedModal}} {{> partials/variantEditModal}} {{/if}} {{> partials/confirmModal}} diff --git a/views/partials/variantPredefinedModal.hbs b/views/partials/variantPredefinedModal.hbs new file mode 100644 index 00000000..83d29dee --- /dev/null +++ b/views/partials/variantPredefinedModal.hbs @@ -0,0 +1,41 @@ + +
    diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 4b00ba3e..3f8363ae 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -107,6 +107,7 @@
    {{ @root.__ "Price" }}
    {{ @root.__ "Stock" }}
    diff --git a/views/product-new.hbs b/views/product-new.hbs index ba5c2b0e..256c411d 100644 --- a/views/product-new.hbs +++ b/views/product-new.hbs @@ -50,10 +50,7 @@
    - +
    {{#if config.trackStock}} @@ -121,4 +118,4 @@ minHeight: null }); }); - \ No newline at end of file + diff --git a/views/themes/Cloth/product.hbs b/views/themes/Cloth/product.hbs index 5ac21e45..ed31c36c 100644 --- a/views/themes/Cloth/product.hbs +++ b/views/themes/Cloth/product.hbs @@ -36,6 +36,7 @@
    From 72e93db9f219e99027a6d9213264922956a59faa Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 2 Sep 2021 03:54:32 +0300 Subject: [PATCH 47/79] save & update product dimensions Signed-off-by: nick --- lib/schemas/newProduct.json | 7 +++++- locales/en.json | 7 +++++- locales/it.json | 3 ++- locales/ro.json | 3 ++- public/javascripts/admin.js | 50 +++++++++++++++++++++++++------------ routes/product.js | 14 +++++++++-- test/specs/products.js | 27 ++++++++++++++++++++ views/product-edit.hbs | 15 +++++++++-- views/product-new.hbs | 22 +++++++++++++--- 9 files changed, 120 insertions(+), 28 deletions(-) diff --git a/lib/schemas/newProduct.json b/lib/schemas/newProduct.json index 3871554b..1df0d1be 100644 --- a/lib/schemas/newProduct.json +++ b/lib/schemas/newProduct.json @@ -42,6 +42,11 @@ "productStock": { "type": ["number", "null"] }, + "productDimensions" : { + "width" : {"type": "number" }, + "length" : {"type": "number" }, + "height" : {"type": "number" } + }, "productStockDisable": { "type": "boolean" } @@ -60,4 +65,4 @@ "productDescription", "productPublished" ] -} \ No newline at end of file +} diff --git a/locales/en.json b/locales/en.json index 103c3cc5..9f6b62a1 100644 --- a/locales/en.json +++ b/locales/en.json @@ -255,5 +255,10 @@ "black": "black", "white": "white", "red": "red", - "Add variant": "Add variant" + "Add variant": "Add variant", + "height*length*width": "height*length*width", + "height*width*length": "height*width*length", + "No current variants": "No current variants", + "Permalink": "Permalink", + "Dimensions": "Dimensions" } \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index 4f38ad82..28afe276 100644 --- a/locales/it.json +++ b/locales/it.json @@ -205,5 +205,6 @@ "Stock": "Stock", "Save variant": "Save variant", "View": "View", - "white": "white" + "white": "white", + "test-jacket-variant": "test-jacket-variant" } \ No newline at end of file diff --git a/locales/ro.json b/locales/ro.json index e24fd880..55c98d2f 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -251,5 +251,6 @@ "black": "black", "red": "red", "Add variant": "Add variant", - "Add Color": "Add Color" + "Add Color": "Add Color", + "test-jacket-variant": "test-jacket-variant" } \ No newline at end of file diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index 51e2fa80..a2a6a703 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -49,7 +49,7 @@ $(document).ready(function (){ $.ajax({ method: 'POST', url: '/admin/product/editvariant', - data: { + data:{ product: $('#variant-edit-product').val(), variant: $('#variant-edit-id').val(), title: $('#variant-edit-title').val(), @@ -236,22 +236,32 @@ $(document).ready(function (){ if($('#productPermalink').val() === '' && $('#productTitle').val() !== ''){ $('#productPermalink').val(slugify($('#productTitle').val())); } + const data = JSON.stringify({ + productTitle: $('#productTitle').val(), + productPrice: $('#productPrice').val(), + productPublished: $('#productPublished').val(), + productStock: $('#productStock').val(), + productDescription: $('#productDescription').val(), + productGtin: $('#productGtin').val(), + productBrand: $('#productBrand').val(), + productPermalink: $('#productPermalink').val(), + productSubscription: $('#productSubscription').val(), + productComment: $('#productComment').is(':checked'), + productTags: $('#productTags').val(), + productDimensions: { + length: $('#productDimensionsLength').val(), + width: $('#productDimensionsWidth').val(), + height: $('#productDimensionsHeight').val(), + } + }) + console.log(data); $.ajax({ method: 'POST', url: '/admin/product/insert', - data: { - productTitle: $('#productTitle').val(), - productPrice: $('#productPrice').val(), - productPublished: $('#productPublished').val(), - productStock: $('#productStock').val(), - productDescription: $('#productDescription').val(), - productGtin: $('#productGtin').val(), - productBrand: $('#productBrand').val(), - productPermalink: $('#productPermalink').val(), - productSubscription: $('#productSubscription').val(), - productComment: $('#productComment').is(':checked'), - productTags: $('#productTags').val() - } + 'dataType': 'json', + 'contentType': 'application/json', + processData: false, + data: data }) .done(function(msg){ showNotification(msg.message, 'success', false, '/admin/product/edit/' + msg.productId); @@ -283,7 +293,10 @@ $(document).ready(function (){ $.ajax({ method: 'POST', url: '/admin/product/update', - data: { + 'dataType': 'json', + 'contentType': 'application/json', + processData: false, + data: JSON.stringify({ productId: $('#productId').val(), productTitle: $('#productTitle').val(), productPrice: $('#productPrice').val(), @@ -297,8 +310,13 @@ $(document).ready(function (){ productSubscription: $('#productSubscription').val(), productComment: $('#productComment').is(':checked'), productTags: $('#productTags').val(), + productDimensions: { + length: $('#productDimensionsLength').val(), + width: $('#productDimensionsWidth').val(), + height: $('#productDimensionsHeight').val(), + }, ...varfields - } + }) }) .done(function(msg){ showNotification(msg.message, 'success', true); diff --git a/routes/product.js b/routes/product.js index 1040813d..7cd04309 100644 --- a/routes/product.js +++ b/routes/product.js @@ -111,7 +111,12 @@ router.post('/admin/product/insert', restrict, checkAccess, async (req, res) => productComment: checkboxBool(req.body.productComment), productAddedDate: new Date(), productStock: safeParseInt(req.body.productStock) || null, - productStockDisable: convertBool(req.body.productStockDisable) + productStockDisable: convertBool(req.body.productStockDisable), + productDimensions: { + length : req.body.productDimensions.length, + width : req.body.productDimensions.width, + height: req.body.productDimensions.height + } }; // Validate the body again schema @@ -353,7 +358,12 @@ router.post('/admin/product/update', restrict, checkAccess, async (req, res) => productTags: req.body.productTags, productComment: checkboxBool(req.body.productComment), productStock: safeParseInt(req.body.productStock) || null, - productStockDisable: convertBool(req.body.productStockDisable) + productStockDisable: convertBool(req.body.productStockDisable), + productDimensions: { + length : req.body.productDimensions.length, + width : req.body.productDimensions.width, + height: req.body.productDimensions.height + } }; req.app.config.availableLanguages.map((lang) => { diff --git a/test/specs/products.js b/test/specs/products.js index 78eab256..ed9db790 100644 --- a/test/specs/products.js +++ b/test/specs/products.js @@ -83,6 +83,33 @@ test('[Success] Add a product', async t => { t.deepEqual(res.body.message, 'New product successfully created'); }); +test('[Success] Add a product with dimensions', async t => { + const product = { + productPermalink: 'test-jacket', + productTitle: 'Test Jacket', + productPrice: '100.00', + productDescription: 'Test product description used to describe the product', + productPublished: true, + productTags: 'organic, jacket', + productComment: false, + productStock: 50, + productDimensions : { + length : 180, + height : 105, + width : 47 + } + }; + + const res = await g.request + .post('/admin/product/insert') + .send(product) + .set('apiKey', g.users[0].apiKey) + .expect(200); + + // Check the returned message + t.deepEqual(res.body.message, 'New product successfully created'); +}); + test('[Success] Add a product with incorrect GTIN', async t => { const product = { productPermalink: 'test-jacket-invalid-gtin', diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 3f8363ae..1e368cd3 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -87,7 +87,7 @@
    - +
    @@ -97,6 +97,17 @@

    {{ @root.__ "This sets a readable URL for the product" }}

    +
    +
    + +
    + X + X + +
    +

    {{ @root.__ "height*width*length" }}

    +
    +
    @@ -149,7 +160,7 @@ {{else}}
  • -
    No current variants
    +
    {{ @root.__ "No current variants"}}
  • {{/if}} diff --git a/views/product-new.hbs b/views/product-new.hbs index 256c411d..fc1c5855 100644 --- a/views/product-new.hbs +++ b/views/product-new.hbs @@ -50,7 +50,10 @@
    - +
    {{#if config.trackStock}} @@ -70,16 +73,27 @@
    - +
    - +
    - +

    {{ @root.__ "This sets a readable URL for the product" }}

    +
    +
    + +
    + X + X + +
    +

    {{ @root.__ "height*width*length" }}

    +
    +
    {{#contains config.paymentGateway 'stripe'}}
    From bdd1a8ee1809475a0f04567ab971767c2fc9051d Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 2 Sep 2021 04:10:08 +0300 Subject: [PATCH 48/79] dimensions Signed-off-by: nick --- locales/en.json | 3 +- views/layouts/layout.hbs | 1 + views/partials/variantDimensionsModal.hbs | 38 +++++++++++++++++++++++ views/product-edit.hbs | 1 + 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 views/partials/variantDimensionsModal.hbs diff --git a/locales/en.json b/locales/en.json index 9f6b62a1..0d8b5530 100644 --- a/locales/en.json +++ b/locales/en.json @@ -260,5 +260,6 @@ "height*width*length": "height*width*length", "No current variants": "No current variants", "Permalink": "Permalink", - "Dimensions": "Dimensions" + "Dimensions": "Dimensions", + "Add Dimension": "Add Dimension" } \ No newline at end of file diff --git a/views/layouts/layout.hbs b/views/layouts/layout.hbs index 03b76af8..a0fd721b 100644 --- a/views/layouts/layout.hbs +++ b/views/layouts/layout.hbs @@ -290,6 +290,7 @@ {{> partials/validationModal}} {{> partials/variantModal}} {{> partials/variantPredefinedModal}} + {{> partials/variantDimensionsModal}} {{> partials/variantEditModal}} {{/if}} {{> partials/confirmModal}} diff --git a/views/partials/variantDimensionsModal.hbs b/views/partials/variantDimensionsModal.hbs new file mode 100644 index 00000000..ea4ed8b4 --- /dev/null +++ b/views/partials/variantDimensionsModal.hbs @@ -0,0 +1,38 @@ + +
    diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 1e368cd3..680c90b8 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -118,6 +118,7 @@
    {{ @root.__ "Price" }}
    {{ @root.__ "Stock" }}
    From 28f185792b38e5e1915af7f2234068758523d386 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 2 Sep 2021 04:20:30 +0300 Subject: [PATCH 49/79] show dimensions if present Signed-off-by: nick --- views/themes/Cloth/product.hbs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/views/themes/Cloth/product.hbs b/views/themes/Cloth/product.hbs index ed31c36c..d7fd00c5 100644 --- a/views/themes/Cloth/product.hbs +++ b/views/themes/Cloth/product.hbs @@ -36,7 +36,6 @@
    @@ -75,6 +74,15 @@
    {{{fixTags result.productDescription}}}
    + {{#if result.productDimensions}} +
    +
    {{ @root.__ "Dimensions" }}:
    +
    {{{result.productDimensions.height}}} X + {{{result.productDimensions.width}}} X + {{{result.productDimensions.length}}}
    +
    + {{/if}} + {{#if @root.config.modules.enabled.reviews}}
    From 2dcbbce3128b03018ce5c71e3da77951654f0e6f Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 2 Sep 2021 04:25:20 +0300 Subject: [PATCH 50/79] can we test on windows too? Signed-off-by: nick --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 95811dd8..a1599e16 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -6,7 +6,7 @@ on: branches: [ master ] jobs: build: - runs-on: ubuntu-latest + runs-on: [windows-latest,ubuntu-latest] strategy: matrix: node-version: [12.x, 13.x, 14.x] From 551f1cd3fe24fc2d66884ae8b7cbd455449248ce Mon Sep 17 00:00:00 2001 From: Nick Meiremans Date: Thu, 2 Sep 2021 21:44:41 +0300 Subject: [PATCH 51/79] Size for product (#25) * v++ Signed-off-by: nick * variants can override some product properties Signed-off-by: nick * minimum node 14 Signed-off-by: nick * remove hooks in settings file Signed-off-by: nick * change error message Signed-off-by: nick --- .github/workflows/tests.yaml | 6 +-- config/settings.json | 6 +-- lib/schemas/newVariant.json | 12 ++++- locales/en.json | 5 ++- locales/it.json | 5 ++- locales/ro.json | 4 +- package-lock.json | 17 +++++-- package.json | 2 +- public/javascripts/admin.js | 19 ++++++-- routes/product.js | 78 ++++++++++++++++++++++++--------- test/specs/variants.js | 30 ++++++++++++- views/partials/variantModal.hbs | 37 ++++++++++++---- views/product-edit.hbs | 2 - 13 files changed, 173 insertions(+), 50 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index a1599e16..a5c356c7 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -6,11 +6,11 @@ on: branches: [ master ] jobs: build: - runs-on: [windows-latest,ubuntu-latest] + runs-on: ubuntu-latest strategy: matrix: - node-version: [12.x, 13.x, 14.x] - mongodb-version: [4.2] + node-version: [14.x] + mongodb-version: [5.0] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} diff --git a/config/settings.json b/config/settings.json index bf434228..a4951c27 100644 --- a/config/settings.json +++ b/config/settings.json @@ -26,13 +26,13 @@ "orderHook": "", "hooks" : { "product" : { - "onCreate" : "http://localhost" + "onCreate" : "" }, "variant" : { - "onCreate" : "http://localhost" + "onCreate" : "" }, "order" : { - "onCreate" : "http://localhost" + "onCreate" : "" } }, diff --git a/lib/schemas/newVariant.json b/lib/schemas/newVariant.json index 3b16742b..50ad744c 100644 --- a/lib/schemas/newVariant.json +++ b/lib/schemas/newVariant.json @@ -20,7 +20,16 @@ }, "type" : { "type": "string" - } + }, + "productDimensions" :{ + "type" : "object", + "properties" : { + "length": {"type" : "string"}, + "width": {"type" : "string"}, + "height": {"type" : "string"} + } + }, + "color" : {"type": "string"} }, "errorMessage": { "isNotEmpty": "This is my custom error message", @@ -30,7 +39,6 @@ }, "required": [ "product", - "title", "price", "stock" ] diff --git a/locales/en.json b/locales/en.json index 0d8b5530..b0106bf9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -261,5 +261,8 @@ "No current variants": "No current variants", "Permalink": "Permalink", "Dimensions": "Dimensions", - "Add Dimension": "Add Dimension" + "Add Dimension": "Add Dimension", + "Shown in the variant dropdown, will be color - dimensions if let empty": "Shown in the variant dropdown, will be color - dimensions if let empty", + "Color": "Color", + "color": "color" } \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index 28afe276..ffdcf962 100644 --- a/locales/it.json +++ b/locales/it.json @@ -206,5 +206,8 @@ "Save variant": "Save variant", "View": "View", "white": "white", - "test-jacket-variant": "test-jacket-variant" + "test-jacket-variant": "test-jacket-variant", + "test-jacket-variant-black-xs": "test-jacket-variant-black-xs", + "black": "black", + "": "" } \ No newline at end of file diff --git a/locales/ro.json b/locales/ro.json index 55c98d2f..f5835b2f 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -252,5 +252,7 @@ "red": "red", "Add variant": "Add variant", "Add Color": "Add Color", - "test-jacket-variant": "test-jacket-variant" + "test-jacket-variant": "test-jacket-variant", + "test-jacket-variant-black-xs": "test-jacket-variant-black-xs", + "": "" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 032a6bb6..78a5b333 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "express-cart", - "version": "1.1.19", + "version": "1.1.20", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "express-cart", - "version": "1.1.19", + "version": "1.1.20", "license": "MIT", "dependencies": { "@adyen/api-library": "^2.1.7", @@ -25,6 +25,7 @@ "csurf": "^1.11.0", "dotenv": "^8.2.0", "express": "^4.17.1", + "express-async-handler": "^1.1.4", "express-handlebars": "^3.1.0", "express-rate-limit": "^5.0.0", "express-session": "^1.17.0", @@ -79,7 +80,7 @@ "uglify-es": "^3.3.9" }, "engines": { - "node": ">=10.16.0 <0.15" + "node": ">=12.13.0 <0.15" } }, "node_modules/@adyen/api-library": { @@ -3732,6 +3733,11 @@ "node": ">= 0.10.0" } }, + "node_modules/express-async-handler": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz", + "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==" + }, "node_modules/express-handlebars": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.1.0.tgz", @@ -12745,6 +12751,11 @@ } } }, + "express-async-handler": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz", + "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==" + }, "express-handlebars": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.1.0.tgz", diff --git a/package.json b/package.json index de33ac93..3d8590a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "express-cart", - "version": "1.1.19", + "version": "1.1.20", "description": "A fully functioning Node.js shopping cart with Stripe, PayPal and Authorize.net payments.", "private": false, "scripts": { diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index a2a6a703..30e0dfb9 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -97,20 +97,33 @@ $(document).ready(function (){ }); $(document).on('click', '#addVariant', function(e){ + const varfields = allLanguages.reduce((acc,x) => { - acc[`variantTitle_${x}`] = $(`#variant-title_${x}`).val(); + if($(`#variant-title_${x}`).val()) { + acc[`variantTitle_${x}`] = $(`#variant-title_${x}`).val(); + } return acc; },{}); + $.ajax({ method: 'POST', url: '/admin/product/addvariant', - data: { + 'dataType': 'json', + 'contentType': 'application/json', + processData: false, + data: JSON.stringify({ product: $('#variant-product').val(), title: $('#variant-title').val(), price: $('#variant-price').val(), stock: $('#variant-stock').val(), + productDimensions: { + length: $('#variant-dimension-length').val(), + width: $('#variant-dimension-width').val(), + height: $('#variant-dimension-height').val(), + }, + color: $('#chooseVariant-color').val(), ...varfields - } + }) }) .done(function(msg){ showNotification(msg.message, 'success', true); diff --git a/routes/product.js b/routes/product.js index 7cd04309..9a3fad07 100644 --- a/routes/product.js +++ b/routes/product.js @@ -12,7 +12,7 @@ const { const { indexProducts } = require('../lib/indexing'); const { validateJson } = require('../lib/schema'); const { paginateData } = require('../lib/paginate'); -const {getNonDefaultLanguages} = require('../lib/config'); +const {getNonDefaultLanguages, getConfig} = require('../lib/config'); const colors = require('colors'); const rimraf = require('rimraf'); const fs = require('fs'); @@ -197,25 +197,73 @@ router.get('/admin/product/edit/:id', restrict, checkAccess, async (req, res) => }); }); +const titleGenerator = (__,title,color,dimensions,product) => { + let titles ={} + if(!title){ + titles = getNonDefaultLanguages().reduce((acc,x) => { + acc[`title_${x}`] = defaultTitleLogic(__,title,color,dimensions,x,product); + return acc + },{}) ; + titles[`title`] = defaultTitleLogic(__,title,color,dimensions,getConfig().defaultLocale,product); + }else{ + titles = getNonDefaultLanguages().reduce((acc,x) => { + acc[`title_${x}`] = title; + return acc + },{}); + titles[`title`] = title; + } + return titles; +} +const defaultTitleLogic = (__, title,untranslatedColor,dimensions, language,product) => { + const color = __({phrase :untranslatedColor,locale : language}) + const sameDimension = ( + product?.productDimensions.length === dimensions.length + && product?.productDimensions.width === dimensions.width + && product?.productDimensions.height === dimensions.height ) + + return title ? + title : color ? + dimensions && !sameDimension ? + `${color} - ${dimensions.height}x${dimensions.width}x${dimensions.length}` : + color : + dimensions && !sameDimension ? + `${dimensions.height}x${dimensions.width}x${dimensions.length}` : + undefined +} + // Add a variant to a product router.post('/admin/product/addvariant', restrict, checkAccess, async (req, res) => { const db = req.app.db; - const languages = getNonDefaultLanguages().reduce((acc,x) => { - acc[`title_${x}`] = req.__({phrase :req.body.title,locale : x}); - return acc - },{}) + // Check product exists + try{ + const product = await db.products.findOne({ _id: getId(req.body.product) }); + + if(!product){ + console.log("no product found"); + res.status(400).json({ message: 'Failed to add product variant' }); + return; + } const variantDoc = { product: req.body.product, - title: req.body.title, + ...titleGenerator(req.__,req.body.title,req.body.color,req.body.productDimensions, product), price: req.body.price, stock: safeParseInt(req.body.stock) || null, - type: req.body.type, - ...languages + type: req.body.type }; + if(req.body.productDimensions) { + variantDoc.productDimensions = { + width: req.body.productDimensions.width, + length: req.body.productDimensions.length, + height: req.body.productDimensions.height + } + } + if(req.body.color){ + variantDoc.color = req.body.color + } - // Validate the body again schema + // Validate the body against schema const schemaValidate = validateJson('newVariant', variantDoc); if(!schemaValidate.result){ if(process.env.NODE_ENV !== 'test'){ @@ -225,29 +273,19 @@ router.post('/admin/product/addvariant', restrict, checkAccess, async (req, res) return; } - // Check product exists - const product = await db.products.findOne({ _id: getId(req.body.product) }); - if(!product){ - console.log('here1?'); - res.status(400).json({ message: 'Failed to add product variant' }); - return; - } // Fix values variantDoc.product = getId(req.body.product); variantDoc.added = new Date(); - try{ const variant = await db.variants.insertOne(variantDoc); product.variants = variant.ops; - const productWithNewVariant = {...product, productVariants : variant.ops}; - hooker.emit("variant_onCreate",productWithNewVariant); + hooker.emit("variant_onCreate",product); res.status(200).json({ message: 'Successfully added variant', product }); }catch(ex){ - console.log('here?'); res.status(400).json({ message: 'Failed to add variant. Please try again' }); } }); diff --git a/test/specs/variants.js b/test/specs/variants.js index b0bde12f..0b2575be 100644 --- a/test/specs/variants.js +++ b/test/specs/variants.js @@ -32,6 +32,34 @@ test('[Success] Add a variant to a product', async t => { t.deepEqual(res.body.product.variants[0].product, g.products[0]._id.toString()); }); +test('[Success] Add a variant overrulling color and dimensions to a product', async t => { + const variant = { + title: 'test-jacket-variant-black-xs', + price: '200.00', + stock: 10, + product: g.products[0]._id, + productDimensions : { + width : "50", + length : "50", + height : "50" + }, + color : "black" + }; + + const res = await g.request + .post('/admin/product/addvariant') + .send(variant) + .set('apiKey', g.users[0].apiKey) + .expect(200); + + // Check the returned message + t.deepEqual(res.body.message, 'Successfully added variant'); + t.deepEqual(res.body.product.variants[0].title, variant.title); + t.deepEqual(res.body.product.variants[0].price, variant.price); + t.deepEqual(res.body.product.variants[0].stock, variant.stock); + t.deepEqual(res.body.product.variants[0].product, g.products[0]._id.toString()); +}); + test('[Success] Add a variant with null stock', async t => { const variant = { title: 'test-jacket-variant', @@ -87,7 +115,7 @@ test('[Fail] Add a variant to an invalid product', async t => { .expect(400); // Check the returned message - t.deepEqual(res.body[0].message, 'should match format "objectid"'); + t.deepEqual(res.body.message, 'Failed to add product variant'); }); test('[Success] Update existing variant', async t => { diff --git a/views/partials/variantModal.hbs b/views/partials/variantModal.hbs index 6efd1228..afd20518 100644 --- a/views/partials/variantModal.hbs +++ b/views/partials/variantModal.hbs @@ -2,7 +2,7 @@ -
    \ No newline at end of file +
    diff --git a/views/product-edit.hbs b/views/product-edit.hbs index 680c90b8..28cc5cf0 100644 --- a/views/product-edit.hbs +++ b/views/product-edit.hbs @@ -118,8 +118,6 @@
    {{ @root.__ "Price" }}
    {{ @root.__ "Stock" }}
    From f3d1c3c5fc0e40c5ab3fe5bce1965ad72370f612 Mon Sep 17 00:00:00 2001 From: Nick Meiremans Date: Thu, 2 Sep 2021 21:47:24 +0300 Subject: [PATCH 52/79] Size for product (#26) * v++ Signed-off-by: nick * variants can override some product properties Signed-off-by: nick * minimum node 14 Signed-off-by: nick * remove hooks in settings file Signed-off-by: nick * change error message Signed-off-by: nick * add .idea to gitignore Signed-off-by: nick --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d539dbbe..92fb2352 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,8 @@ data/ public/uploads /config/*-local.json .vscode +.idea **.DS_Store env.yaml ecosystem.config.js -bin/googleproducts.xml \ No newline at end of file +bin/googleproducts.xml From 7a16a59e6a14508f88056381e478d65fd696e5f8 Mon Sep 17 00:00:00 2001 From: Nick Meiremans Date: Thu, 2 Sep 2021 22:13:50 +0300 Subject: [PATCH 53/79] also copy locales... (#27) Signed-off-by: nick --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index ba0308e3..10b66f90 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,7 @@ COPY config/ /var/expressCart/config/ COPY public/ /var/expressCart/public/ COPY routes/ /var/expressCart/routes/ COPY views/ /var/expressCart/views/ +COPY locales/ /var/expressCart/locales/ COPY app.js /var/expressCart/ COPY package.json /var/expressCart/ From de652b7c7f4a76d9d9a4945243546628493f0ad4 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 3 Sep 2021 00:28:47 +0300 Subject: [PATCH 54/79] merged production hotfixes Signed-off-by: nick --- docker-compose.yml | 4 ++++ routes/admin.js | 5 +++-- routes/product.js | 6 +++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index df12e567..e9bb81b5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,8 @@ services: NODE_PATH: / ports: - "1111:1111" + volumes: + - uploads:/var/expressCart/public/uploads links: - mongodb depends_on: @@ -18,6 +20,8 @@ services: container_name: "expresscart-mongodb" volumes: - expresscart-mongo-data:/data/db + - uploads + ports: - 27017:27017 command: mongod --smallfiles --logpath=/dev/null diff --git a/routes/admin.js b/routes/admin.js index adddef6f..a8fe6d59 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -680,12 +680,13 @@ router.post('/admin/file/upload', restrict, checkAccess, upload.single('uploadFi checkDirectorySync(uploadDir); checkDirectorySync(thumbnailDir); - const imagePath = path.join('/uploads', productPath, file.originalname); - const thumbnailPath = path.join('/uploads', productPath,"thumbnails"); // Setup the new path const sanitizedFileName = file.originalname.replace(/ /g, '_'); + const imagePath = path.join('/uploads', productPath, sanitizedFileName); + const thumbnailPath = path.join('/uploads', productPath,"thumbnails",sanitizedFileName); + // save the new file const dest = fs.createWriteStream(path.join(uploadDir, sanitizedFileName)); diff --git a/routes/product.js b/routes/product.js index 9a3fad07..d7d7305e 100644 --- a/routes/product.js +++ b/routes/product.js @@ -113,9 +113,9 @@ router.post('/admin/product/insert', restrict, checkAccess, async (req, res) => productStock: safeParseInt(req.body.productStock) || null, productStockDisable: convertBool(req.body.productStockDisable), productDimensions: { - length : req.body.productDimensions.length, - width : req.body.productDimensions.width, - height: req.body.productDimensions.height + length : req.body.productDimensions?.length, + width : req.body.productDimensions?.width, + height: req.body.productDimensions?.height } }; From 6e38a295fec4c0f89f317174d8198b34850366c3 Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 4 Sep 2021 14:46:27 +0300 Subject: [PATCH 55/79] sidebar-brand is 80% height, to scale for other logo's menus will have a fallback to default Signed-off-by: nick --- lib/menu.js | 11 ++++++----- locales/ro.json | 6 +++++- public/stylesheets/less/admin.less | 25 +++++++++++++------------ 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/lib/menu.js b/lib/menu.js index 257ac659..70775a6f 100644 --- a/lib/menu.js +++ b/lib/menu.js @@ -5,11 +5,12 @@ const ObjectId = require('mongodb').ObjectID; const Config = getConfig() const getMenu = async (db, language) => { - if (language && language !== Config.defaultLocale) { - const menu = await db.menu.findOne({language: language}); - if (menu) return menu; - } - return await db.menu.findOne({language: {$exists: false}}); + let menu; + if (language) menu = await db.menu.findOne({language: language}); + + if(!menu) menu = await db.menu.findOne({language: Config.defaultLocale}); + if(!menu) menu = await db.menu.findOne({language: {$exists: false}}); + return menu; }; const getMenuById = async (db,id) => { diff --git a/locales/ro.json b/locales/ro.json index f5835b2f..292928d6 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -254,5 +254,9 @@ "Add Color": "Add Color", "test-jacket-variant": "test-jacket-variant", "test-jacket-variant-black-xs": "test-jacket-variant-black-xs", - "": "" + "": "", + "Shown in the variant dropdown, will be color - dimensions if let empty": "Shown in the variant dropdown, will be color - dimensions if let empty", + "color": "color", + "Dimensions": "Dimensions", + "height*width*length": "height*width*length" } \ No newline at end of file diff --git a/public/stylesheets/less/admin.less b/public/stylesheets/less/admin.less index 6a9abf8b..60aa5c66 100644 --- a/public/stylesheets/less/admin.less +++ b/public/stylesheets/less/admin.less @@ -168,8 +168,8 @@ body .popover{display:none !important; } background-color: #007bff; } -.global-result:hover .global-result-detail, -.global-result:hover .global-result-type, +.global-result:hover .global-result-detail, +.global-result:hover .global-result-type, .global-result:hover .global-result-type .fal { color: #fff !important; } @@ -183,7 +183,7 @@ body .popover{display:none !important; } } .global-result:first-child { - border-top-left-radius: 0; + border-top-left-radius: 0; border-top-right-radius: 0; } @@ -229,7 +229,7 @@ body .popover{display:none !important; } background-color: white; box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); } - + .sidebar-sticky { position: relative; top: 0; @@ -238,35 +238,36 @@ body .popover{display:none !important; } overflow-x: hidden; overflow-y: auto; } - + @supports ((position: -webkit-sticky) or (position: sticky)) { .sidebar-sticky { position: -webkit-sticky; position: sticky; } } - + .sidebar .nav-link { font-weight: 400; color: #333; } - + .sidebar .nav-link .feather { margin-right: 4px; color: #999; } - + .sidebar .nav-link:hover .feather, .sidebar .nav-link.active .feather { color: inherit; } - + .sidebar-heading { font-size: .75rem; text-transform: uppercase; } .sidebar-brand { + height: 80%; width: 80%; } @@ -297,10 +298,10 @@ body .popover{display:none !important; } padding-top: 20px; margin-bottom: 20px; } - + @media (min-width: 768px) { [role="main"] { - padding-top: 20px; + padding-top: 20px; padding-bottom: 20px; } } @@ -346,4 +347,4 @@ body .popover{display:none !important; } .footer { padding-top: 10px; } -} \ No newline at end of file +} From 8ecaa18b47765bde9abbd6e906e157dc7b1786d9 Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 4 Sep 2021 16:10:32 +0300 Subject: [PATCH 56/79] pass test Signed-off-by: nick --- test/specs/products.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/specs/products.js b/test/specs/products.js index ed9db790..cb767c1c 100644 --- a/test/specs/products.js +++ b/test/specs/products.js @@ -85,7 +85,7 @@ test('[Success] Add a product', async t => { test('[Success] Add a product with dimensions', async t => { const product = { - productPermalink: 'test-jacket', + productPermalink: 'test-jacket-with-size', productTitle: 'Test Jacket', productPrice: '100.00', productDescription: 'Test product description used to describe the product', @@ -94,9 +94,9 @@ test('[Success] Add a product with dimensions', async t => { productComment: false, productStock: 50, productDimensions : { - length : 180, - height : 105, - width : 47 + length : "180", + height : "105", + width : "47" } }; From 2b15a9c7bcd9866c2d16861ee584059e53f430c4 Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 4 Sep 2021 16:32:58 +0300 Subject: [PATCH 57/79] productDimensions is optional, also in update Signed-off-by: nick --- routes/product.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/routes/product.js b/routes/product.js index d7d7305e..04f724f0 100644 --- a/routes/product.js +++ b/routes/product.js @@ -398,9 +398,9 @@ router.post('/admin/product/update', restrict, checkAccess, async (req, res) => productStock: safeParseInt(req.body.productStock) || null, productStockDisable: convertBool(req.body.productStockDisable), productDimensions: { - length : req.body.productDimensions.length, - width : req.body.productDimensions.width, - height: req.body.productDimensions.height + length : req.body.productDimensions?.length, + width : req.body.productDimensions?.width, + height: req.body.productDimensions?.height } }; From 07bc4c5fda354873118835a9621f195cafb3273a Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 4 Sep 2021 16:58:24 +0300 Subject: [PATCH 58/79] add .iml to gitignore Signed-off-by: nick --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 92fb2352..ffdfc982 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ public/uploads env.yaml ecosystem.config.js bin/googleproducts.xml +/expressCart.iml From fe9890b1392c75db2822bd17cbf779d35fd64461 Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 4 Sep 2021 18:45:08 +0300 Subject: [PATCH 59/79] delete menu with id Signed-off-by: nick --- lib/menu.js | 8 ++++---- public/javascripts/admin.js | 14 +++++++++++--- routes/admin.js | 4 ++-- views/settings-menu.hbs | 2 +- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/menu.js b/lib/menu.js index 70775a6f..45703d67 100644 --- a/lib/menu.js +++ b/lib/menu.js @@ -59,11 +59,11 @@ const newMenu = (req) => { // delete a menu item const deleteMenu = (req, menuIndex) => { const db = req.app.db; - return getMenu(db) + return getMenuById(db,req.body.mongoId) .then((menu) => { // Remove menu item - menu.items.splice(menuIndex, 1); - return db.menu.updateOne({}, { $set: { items: menu.items } }, { upsert: true }) + menu.items = menu.items.filter(x => x.id !==menuIndex); + return db.menu.updateOne({_id : menu._id}, { $set: { items: menu.items } }, { upsert: true }) .then(() => { return true; }); @@ -82,7 +82,7 @@ const updateMenu = (req) => { const menuIndex = _.findIndex(menu.items, ['id', req.body.navId]); menu.items[menuIndex].title = req.body.navMenu; menu.items[menuIndex].link = req.body.navLink; - const updateQuery = (req.body.language === req.app.config.defaultLocale) ? {} : {language : req.body.language} + const updateQuery = {language : req.body.language} return db.menu.updateOne(updateQuery, { $set: { items: menu.items } }, { upsert: true }) .then(() => { diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js index 30e0dfb9..fe48a8bc 100644 --- a/public/javascripts/admin.js +++ b/public/javascripts/admin.js @@ -814,11 +814,21 @@ $(document).ready(function (){ e.preventDefault(); if(confirm('Are you sure?')){ + const language1 = document.getElementById("languageSelector").value; + const defaultLocale = document.getElementById("defaultLocale").value; + + let elementId = 'menuMongoId' + if(defaultLocale !== language1){ + elementId = 'menuMongoId_'+ language1 + } + const mongoId = document.getElementById(elementId).value; + $.ajax({ method: 'POST', url: '/admin/settings/menu/delete', data: { - menuId: $(this).attr('data-id') + menuId: $(this).attr('data-id'), + mongoId } }) .done(function(msg){ @@ -836,8 +846,6 @@ $(document).ready(function (){ var menuOrder = []; const language1 = document.getElementById("languageSelector").value; const defaultLocale = document.getElementById("defaultLocale").value; - console.log(language1); - console.log(defaultLocale); let elementId = 'menuMongoId' if(defaultLocale !== language1){ diff --git a/routes/admin.js b/routes/admin.js index a8fe6d59..7908dcdc 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -434,8 +434,8 @@ router.post('/admin/settings/menu/update', restrict, checkAccess, async (req, re }); // delete menu item -router.post('/admin/settings/menu/delete', restrict, checkAccess, (req, res) => { - const result = deleteMenu(req, req.body.menuId); +router.post('/admin/settings/menu/delete', restrict, checkAccess, async (req, res) => { + const result = await deleteMenu(req, req.body.menuId); if(result === false){ res.status(400).json({ message: 'Failed deleting menu.' }); return; diff --git a/views/settings-menu.hbs b/views/settings-menu.hbs index a5e9814f..81af9604 100644 --- a/views/settings-menu.hbs +++ b/views/settings-menu.hbs @@ -36,7 +36,7 @@
    - + {{{feather 'trash-2'}}}