diff --git a/cartridges/int_bolt_custom/cartridge/templates/default/product/components/addToCartGlobal.isml b/cartridges/int_bolt_custom/cartridge/templates/default/product/components/addToCartGlobal.isml new file mode 100644 index 0000000..f857dce --- /dev/null +++ b/cartridges/int_bolt_custom/cartridge/templates/default/product/components/addToCartGlobal.isml @@ -0,0 +1,14 @@ +
+
+ + + +
+
\ No newline at end of file diff --git a/cartridges/int_bolt_custom/cartridge/templates/default/product/productDetails.isml b/cartridges/int_bolt_custom/cartridge/templates/default/product/productDetails.isml deleted file mode 100644 index bba3623..0000000 --- a/cartridges/int_bolt_custom/cartridge/templates/default/product/productDetails.isml +++ /dev/null @@ -1,156 +0,0 @@ - - - - var assets = require('*/cartridge/scripts/assets'); - assets.addJs('/js/productDetail.js'); - assets.addCss('/css/product/detail.css'); - - - - - - - -
-
-
- -
- -
- - -
-
-

${product.productName}

-
-
-
-
- -
- - - -
- -
-
- -
-
- - -
-
-

${product.productName}

-
-
- - -
-
- -
-
- -
- - - - - - -
-
- -
- - - -
- -
-
-
-
- - -
-
-
- -
-
-
-
- -
- - - -
- - - -
-
- -
-
-
- - - - - -
-
- -
-
- -
-
-
- -
- - -
-
-
- - - - -
- - - -
- -
-
- - -
- -
-
-
-
- -
- -
- - - - -
- -
-
-
-
diff --git a/cartridges/int_bolt_sfra/cartridge/client/default/js/boltProductPageButton.js b/cartridges/int_bolt_sfra/cartridge/client/default/js/boltProductPageButton.js new file mode 100644 index 0000000..654ae42 --- /dev/null +++ b/cartridges/int_bolt_sfra/cartridge/client/default/js/boltProductPageButton.js @@ -0,0 +1,295 @@ +'use strict'; + +var ppcButtonClass = 'bolt-product-checkout-button'; +// isProductPageCheckoutButtonVisible is used to track the visibility of the PPC button +var ppcButtonVisible; +// ppcCart contains BoltCart which is obtained by calling BoltCheckout.configureProductCheckout +var ppcCart; +// setupPPCButtonPoller is the ID of the timer that is used to show the Bolt PPC button. +var setupPPCButtonPoller; + +var successRedirect = $('#successRedirect').val(); +var sfccData; +var callbacks = { + check: function () { + console.log('Inside check function'); + if (ppcCart) { + return ppcCart; + } + + if (ppcButtonVisible) { + // Display an error message to the user. + console.error('Bolt ppc cart is invalid'); + } + return undefined; + }, + close: function () { + // This function is called when the Bolt checkout modal is closed. + var sfccBaseVersion = $('#sfccBaseVersion').val(); + if (sfccData && sfccBaseVersion >= 6) { + var redirect = $('
') + .appendTo(document.body) + .attr({ + method: 'POST', + action: successRedirect + }); + + $('') + .appendTo(redirect) + .attr({ + name: 'orderID', + value: sfccData.merchant_order_number + }); + + $('') + .appendTo(redirect) + .attr({ + name: 'orderToken', + value: sfccData.sfcc.sfcc_order_token + }); + + redirect.submit(); + } + }, + onCheckoutStart: function () { + // This function is called after the checkout form is presented to the user. + }, + + // eslint-disable-next-line no-unused-vars + onEmailEnter: function (email) { + // This function is called after the user enters their email address. + }, + + onShippingDetailsComplete: function () { + // This function is called when the user proceeds to the shipping options page. + // This is applicable only to multi-step checkout. + }, + + onShippingOptionsComplete: function () { + // This function is called when the user proceeds to the payment details page. + // This is applicable only to multi-step checkout. + }, + + onPaymentSubmit: function () { + // This function is called after the user clicks the pay button. + }, + success: function (transaction, callback) { + // This function is called when the Bolt checkout transaction is successful. + sfccData = transaction; + console.log(`----------- ${JSON.stringify(transaction)} -----------`); + callback(); + } +}; + +var showPPCButton = function () { + setupPPCButtonPoller = setInterval(function () { + var ppcBoltButton = $('.bolt-button-wrapper[data-tid="instant-bolt-checkout-button"]'); // @ts-ignore + var ppcButtonLoaded = ppcBoltButton && window.BoltCheckout && ppcBoltButton.children()[0].nodeName === 'svg'; + if (ppcButtonLoaded) { + ppcBoltButton[0].style.display = ''; + ppcButtonVisible = true; + clearInterval(setupPPCButtonPoller); + } + }, 250); +}; + +var hidePPCButton = function () { + if (setupPPCButtonPoller) { + clearInterval(setupPPCButtonPoller); + } + var ppcBoltButton = $('.bolt-button-wrapper[data-tid="instant-bolt-checkout-button"]'); // @ts-ignore + if (ppcBoltButton) { + ppcBoltButton[0].style.display = 'None'; + } + ppcButtonVisible = false; +}; + +// configurePPCCart should be called as soon as the product is ready to be ordered and +// whenever the product's attributes change. +var configurePPCCartAndShowButton = function (boltCartObject) { + if (!window.BoltCheckout) { + console.error('Unable to call BoltConnect.ConfigureProductCheckout since window.BoltCheckout is defined'); + return; + } + ppcCart = boltCartObject; + var result = window.BoltCheckout.configureProductCheckout( + boltCartObject, + {}, // Hints + callbacks, + { checkoutButtonClassName: ppcButtonClass } + ); + if (result instanceof Error) { + console.error(`Call to BoltCheckout.configureProductCheckout returned an error ${result.toString()}`); + return; + } + console.log('Call to BoltCheckout.configureProductCheckout was successful'); + showPPCButton(); +}; + +// configurePPCCart should be called as soon as the product is ready to be ordered and +// whenever the product's attributes change. +var clearPPCCartAndHideButton = function () { + ppcCart = undefined; + hidePPCButton(); +}; + +const buildBoltCartObject = function (product) { + if (!product.available || !product.readyToOrder) { + return undefined; + } + + const productID = product.id; + const productImage = product.images.small[0].absURL; + const productName = product.productName; + const quantity = product.selectedQuantity; + var productOptions = []; + // To get options such as "Extended Warranty" and send to Bolt server for creating cart. + if (!$('.bundle-item').length) { + var addToCartBtn = $('button.add-to-cart'); + var $productContainer = addToCartBtn.closest('.product-detail'); + if (!$productContainer.length) { + $productContainer = addToCartBtn.closest('.quick-view-dialog').find('.product-detail'); + } + productOptions = getOptions($productContainer); + } + + return { + items: [ + { + reference: productID, + merchantProductID: productID, + quantity: quantity, + name: productName, + image: productImage, + options: JSON.stringify(productOptions) + } + ] + }; +}; + +/** + * Retrieves the relevant pid value + * @param {jquery} $el - DOM container for a given add to cart button + * @return {string} - value to be used when adding product to cart + */ +var getPidValue = function ($el) { + var pid; + + if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) { + pid = $($el).closest('.modal-content').find('.product-quickview').data('pid'); + } else if ($('.product-set-detail').length || $('.product-set').length) { + pid = $($el).closest('.product-detail').find('.product-id').text(); + } else { + pid = $('.product-detail:not(".bundle-item")').data('pid'); + } + + return pid; +}; + +/** + * Retrieve product options + * + * @param {jQuery} $productContainer - DOM element for current product + * @return {string} - Product options and their selected values + */ +var getOptions = function ($productContainer) { + var options = $productContainer + .find('.product-option') + .map(function () { + var $elOption = $(this).find('.options-select'); + var urlValue = $elOption.val(); + var selectedValueId = $elOption.find('option[value="' + urlValue + '"]') + .data('value-id'); + return { + option_id: $(this).data('option-id'), + option_value_id: selectedValueId + }; + }).toArray(); + + return options; +}; + +var getProductDetails = function (addToCartBtn) { + var pid = getPidValue(addToCartBtn); + var productContainer = addToCartBtn.closest('.product-detail'); + var ppcQuantity = productContainer.find('.quantity-select').val(); + var getProductDataUrl = $('.get-ppc-product-data').val() + '?pid=' + pid + '&quantity=' + ppcQuantity; + var productDetails = null; + $.ajax({ + url: getProductDataUrl, + method: 'GET', + async: false, + success: function (data) { + if (data !== null && Object.prototype.hasOwnProperty.call(data, 'product')) { + productDetails = data.product; + var product = data.product; + if (product.available && product.readyToOrder) { + var boltCartObject = buildBoltCartObject(product); + configurePPCCartAndShowButton(boltCartObject); + } else { + clearPPCCartAndHideButton(); + } + } + } + }); + return productDetails; +}; + +var bindProductBundleQuantityUpdate = function (addToCartBtn) { + var productContainer = addToCartBtn.closest('.product-detail'); + var ppcQuantity = productContainer.find('.quantity-select'); + ppcQuantity.on('change', function () { + var product = getProductDetails(addToCartBtn); + if (!product) { + return; + } + // reset product availability messages + if (product.availability.messages.length > 0) { + $('ul.availability-msg li').remove(); + product.availability.messages.forEach(function (message) { + $('ul.availability-msg').append($('
  • ').html('
    ' + message + '
    ')); + }); + } + // disable/enable add to cart button based on product availability + if (product.available) { + $('.add-to-cart-global').removeAttr('disabled'); + } else { + $('.add-to-cart-global').attr('disabled', 'disabled'); + } + }); +}; + +$(document).ready(function () { + // get add to cart button + var addToCartBtn = $('button.add-to-cart'); + // if add to cart button not found, it could be bundle product + if (addToCartBtn.length === 0) { + addToCartBtn = $('button.add-to-cart-global'); + if (addToCartBtn.length > 0) { + // for product bundle, need to bind the ppc logic to quantity field + bindProductBundleQuantityUpdate(addToCartBtn); + } + } + // if no add to cart button is found, return + if (addToCartBtn.length === 0) { + return; + } + // When product details page has fully loaded and if the add-to-cart button is enabled, + // we can get product data from controller Product-Variation (which is defined in sfcc core) + // to build Bolt cart object to initiate Bolt PPC button + if (!addToCartBtn.prop('disabled')) { + getProductDetails(addToCartBtn); + } + // product:statusUpdate + $(document).bind('product:updateAddToCart', function (_e, productResponse) { + console.log('On Status Update', productResponse); + var product = productResponse.product; + if (product.available && product.readyToOrder) { + var boltCartObject = buildBoltCartObject(product); + console.log(boltCartObject); + configurePPCCartAndShowButton(boltCartObject); + } else { + clearPPCCartAndHideButton(); + } + }); +}); diff --git a/cartridges/int_bolt_sfra/cartridge/controllers/Cart.js b/cartridges/int_bolt_sfra/cartridge/controllers/Cart.js index 62e6830..71435eb 100644 --- a/cartridges/int_bolt_sfra/cartridge/controllers/Cart.js +++ b/cartridges/int_bolt_sfra/cartridge/controllers/Cart.js @@ -14,7 +14,6 @@ var configuration = BoltPreferences.getSitePreferences(); server.append('Show', function (req, res, next) { res.setViewData({ config: configuration, - isPPC: false, component: BOLTCART }); next(); diff --git a/cartridges/int_bolt_sfra/cartridge/controllers/Order.js b/cartridges/int_bolt_sfra/cartridge/controllers/Order.js index 595473e..d12fcb1 100644 --- a/cartridges/int_bolt_sfra/cartridge/controllers/Order.js +++ b/cartridges/int_bolt_sfra/cartridge/controllers/Order.js @@ -9,6 +9,7 @@ var URLUtils = require('dw/web/URLUtils'); var Site = require('dw/system/Site'); var OrderMgr = require('dw/order/OrderMgr'); var Locale = require('dw/util/Locale'); +var Transaction = require('dw/system/Transaction'); var csrfProtection = require('*/cartridge/scripts/middleware/csrf'); var reportingUrlsHelper = require('*/cartridge/scripts/reportingUrls'); @@ -23,6 +24,7 @@ server.replace( function (req, res, next) { var order; var boltEnableSSO = Site.getCurrent().getCustomPreferenceValue('boltEnableSSO'); + var boltEnablePPC = Site.getCurrent().getCustomPreferenceValue('boltEnablePPC'); if (!req.form.orderToken || !req.form.orderID) { res.render('/error', { @@ -33,16 +35,33 @@ server.replace( order = OrderMgr.getOrder(req.form.orderID, req.form.orderToken); - // This is where different from the base cartridge, skip order customer check for SSO. - // If shopper check the checkbox to create an account during checkout, we set the order to the new created account but not login, + // This is where different from the base cartridge, skip order customer check for SSO and PPC checkout. + // SSO: If shopper check the checkbox to create an account during checkout, we set the order to the new created account but not login, // so the order customer id is different from the guest customer ID in the original request. - if (!order || (!boltEnableSSO && order.customer.ID !== req.currentCustomer.raw.ID)) { + // PPC: If shopper use product page checkout, orders customer ID will be different from the session customer ID + if (!order || (!(boltEnableSSO || boltEnablePPC) && order.customer.ID !== req.currentCustomer.raw.ID)) { res.render('/error', { message: Resource.msg('error.confirmation.error', 'confirmation', null) }); return next(); } + + // Link Order to loggedin SFCC customer when PPC is enabled + if (boltEnablePPC) { + var currentCustomer = req.currentCustomer.raw; + if (currentCustomer.isAuthenticated() || currentCustomer.isExternallyAuthenticated()) { + // get customer email and compare with order email + var orderEmail = order.getCustomerEmail(); + var customerEmail = currentCustomer.getProfile().getEmail(); + if (orderEmail === customerEmail) { + Transaction.wrap(function () { + order.setCustomer(currentCustomer); + }); + } + } + } + var lastOrderID = Object.prototype.hasOwnProperty.call(req.session.raw.custom, 'orderID') ? req.session.raw.custom.orderID : null; if (lastOrderID === req.querystring.ID) { res.redirect(URLUtils.url('Home-Show')); diff --git a/cartridges/int_bolt_sfra/cartridge/controllers/Product.js b/cartridges/int_bolt_sfra/cartridge/controllers/Product.js index d42aa9e..5f443c4 100644 --- a/cartridges/int_bolt_sfra/cartridge/controllers/Product.js +++ b/cartridges/int_bolt_sfra/cartridge/controllers/Product.js @@ -4,15 +4,35 @@ var server = require('server'); var page = module.superModule; server.extend(page); +/* API Includes */ +var ProductMgr = require('dw/catalog/ProductMgr'); /* Script Modules */ var BoltPreferences = require('int_bolt_core/cartridge/scripts/services/utils/preferences'); server.append('Show', function (req, res, next) { - var configuration = BoltPreferences.getSitePreferences(); - res.setViewData({ - config: configuration, - isPPC: true - }); + var params = req.querystring; + var product = ProductMgr.getProduct(params.pid); + if (product != null) { + var displayPPCButton = true; + if ('hideBoltButtonPDP' in product.custom && product.custom.hideBoltButtonPDP == true) { + displayPPCButton = false; + } + var configuration = BoltPreferences.getSitePreferences(); + + // Check if product is available in the inventory. + // need to check if the avaibility logic applies to all product types + var productAvailable = false; + var availablityModel = product.getAvailabilityModel(); + if (availablityModel && availablityModel.isInStock()) { + productAvailable = true; + } + + var renderBoltPPCButton = configuration.boltEnablePPC && productAvailable && displayPPCButton; + res.setViewData({ + config: configuration, + renderBoltPPCButton: renderBoltPPCButton + }); + } next(); }); diff --git a/cartridges/int_bolt_sfra/cartridge/static/default/js/boltModalConfigure.js b/cartridges/int_bolt_sfra/cartridge/static/default/js/boltModalConfigure.js deleted file mode 100644 index 8ec48e4..0000000 --- a/cartridges/int_bolt_sfra/cartridge/static/default/js/boltModalConfigure.js +++ /dev/null @@ -1 +0,0 @@ -!function(I){var g={};function t(n){if(g[n])return g[n].exports;var C=g[n]={i:n,l:!1,exports:{}};return I[n].call(C.exports,C,C.exports,t),C.l=!0,C.exports}t.m=I,t.c=g,t.d=function(I,g,n){t.o(I,g)||Object.defineProperty(I,g,{enumerable:!0,get:n})},t.r=function(I){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})},t.t=function(I,g){if(1&g&&(I=t(I)),8&g)return I;if(4&g&&"object"==typeof I&&I&&I.__esModule)return I;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:I}),2&g&&"string"!=typeof I)for(var C in I)t.d(n,C,function(g){return I[g]}.bind(null,C));return n},t.n=function(I){var g=I&&I.__esModule?function(){return I.default}:function(){return I};return t.d(g,"a",g),g},t.o=function(I,g){return Object.prototype.hasOwnProperty.call(I,g)},t.p="",t(t.s=0)}([function(module,exports,__webpack_require__){"use strict";eval("\n\n$(document).ready(function () {\n // repeat until Bolt button is created\n var boltButtonExist = setInterval(function () {\n var checkoutBoltButton = $('[data-tid=\"instant-bolt-checkout-button\"]'); // @ts-ignore\n\n if (checkoutBoltButton && window.BoltCheckout && checkoutBoltButton.children()[0].nodeName === 'svg') {\n // have to check if child of this dom is svg, otherwise bolt button is not fully rendered (it's the object)\n clearInterval(boltButtonExist);\n // This is a temp hack to make sure default event handler that opens modal doesn't work since we open it here\n // (line 33) We need to open it here instead of relying on default button event handler since user can close\n // the modal, update cart and reopen it. The second time user opens the cart will use the previous\n // Bolt order token since configure (line 32) is not guaranteed to run before modal opens\n\n $('[data-tid=\"instant-bolt-checkout-button\"]').children().replaceWith($('[data-tid=\"instant-bolt-checkout-button\"]').children().clone());\n var createBoltOrderUrl = $('.create-bolt-order-url').val();\n\n // add an event handler to Bolt button's click\n checkoutBoltButton.click(function () {\n // call backend to create cart in Bolt\n $.ajax({\n url: createBoltOrderUrl,\n method: 'GET',\n success: function success(data) {\n if (data !== null) {\n // use the response from backend to configure Bolt connect\n var cart = {\n id: data.basketID\n };\n\n var boltButtonApp = BoltCheckout.configure(cart, data.hints, null); // eslint-disable-line no-undef\n boltButtonApp.open();\n }\n }\n });\n });\n }\n }, 100);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jYXJ0cmlkZ2VzL2ludF9ib2x0X3NmcmEvY2FydHJpZGdlL2NsaWVudC9kZWZhdWx0L2pzL2JvbHRNb2RhbENvbmZpZ3VyZS5qcz9jOGJkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLGdGQUFnRjs7QUFFaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQSxLQUFLO0FBQ0wsQ0FBQyIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgLy8gcmVwZWF0IHVudGlsIEJvbHQgYnV0dG9uIGlzIGNyZWF0ZWRcbiAgICB2YXIgYm9sdEJ1dHRvbkV4aXN0ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2hlY2tvdXRCb2x0QnV0dG9uID0gJCgnW2RhdGEtdGlkPVwiaW5zdGFudC1ib2x0LWNoZWNrb3V0LWJ1dHRvblwiXScpOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgICAgaWYgKGNoZWNrb3V0Qm9sdEJ1dHRvbiAmJiB3aW5kb3cuQm9sdENoZWNrb3V0ICYmIGNoZWNrb3V0Qm9sdEJ1dHRvbi5jaGlsZHJlbigpWzBdLm5vZGVOYW1lID09PSAnc3ZnJykge1xuICAgICAgICAgICAgLy8gaGF2ZSB0byBjaGVjayBpZiBjaGlsZCBvZiB0aGlzIGRvbSBpcyBzdmcsIG90aGVyd2lzZSBib2x0IGJ1dHRvbiBpcyBub3QgZnVsbHkgcmVuZGVyZWQgKGl0J3MgdGhlIG9iamVjdClcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoYm9sdEJ1dHRvbkV4aXN0KTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB0ZW1wIGhhY2sgdG8gbWFrZSBzdXJlIGRlZmF1bHQgZXZlbnQgaGFuZGxlciB0aGF0IG9wZW5zIG1vZGFsIGRvZXNuJ3Qgd29yayBzaW5jZSB3ZSBvcGVuIGl0IGhlcmVcbiAgICAgICAgICAgIC8vIChsaW5lIDMzKSBXZSBuZWVkIHRvIG9wZW4gaXQgaGVyZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gZGVmYXVsdCBidXR0b24gZXZlbnQgaGFuZGxlciBzaW5jZSB1c2VyIGNhbiBjbG9zZVxuICAgICAgICAgICAgLy8gdGhlIG1vZGFsLCB1cGRhdGUgY2FydCBhbmQgcmVvcGVuIGl0LiBUaGUgc2Vjb25kIHRpbWUgdXNlciBvcGVucyB0aGUgY2FydCB3aWxsIHVzZSB0aGUgcHJldmlvdXNcbiAgICAgICAgICAgIC8vIEJvbHQgb3JkZXIgdG9rZW4gc2luY2UgY29uZmlndXJlIChsaW5lIDMyKSBpcyBub3QgZ3VhcmFudGVlZCB0byBydW4gYmVmb3JlIG1vZGFsIG9wZW5zXG5cbiAgICAgICAgICAgICQoJ1tkYXRhLXRpZD1cImluc3RhbnQtYm9sdC1jaGVja291dC1idXR0b25cIl0nKS5jaGlsZHJlbigpLnJlcGxhY2VXaXRoKCQoJ1tkYXRhLXRpZD1cImluc3RhbnQtYm9sdC1jaGVja291dC1idXR0b25cIl0nKS5jaGlsZHJlbigpLmNsb25lKCkpO1xuICAgICAgICAgICAgdmFyIGNyZWF0ZUJvbHRPcmRlclVybCA9ICQoJy5jcmVhdGUtYm9sdC1vcmRlci11cmwnKS52YWwoKTtcblxuICAgICAgICAgICAgLy8gYWRkIGFuIGV2ZW50IGhhbmRsZXIgdG8gQm9sdCBidXR0b24ncyBjbGlja1xuICAgICAgICAgICAgY2hlY2tvdXRCb2x0QnV0dG9uLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBjYWxsIGJhY2tlbmQgdG8gY3JlYXRlIGNhcnQgaW4gQm9sdFxuICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogY3JlYXRlQm9sdE9yZGVyVXJsLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiBzdWNjZXNzKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSByZXNwb25zZSBmcm9tIGJhY2tlbmQgdG8gY29uZmlndXJlIEJvbHQgY29ubmVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYXJ0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZGF0YS5iYXNrZXRJRFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm9sdEJ1dHRvbkFwcCA9IEJvbHRDaGVja291dC5jb25maWd1cmUoY2FydCwgZGF0YS5oaW50cywgbnVsbCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2x0QnV0dG9uQXBwLm9wZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCAxMDApO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n")}]); \ No newline at end of file diff --git a/cartridges/int_bolt_sfra/cartridge/templates/default/cart/boltButton.isml b/cartridges/int_bolt_sfra/cartridge/templates/default/cart/boltButton.isml index d4b287d..8d3bb48 100644 --- a/cartridges/int_bolt_sfra/cartridge/templates/default/cart/boltButton.isml +++ b/cartridges/int_bolt_sfra/cartridge/templates/default/cart/boltButton.isml @@ -1,5 +1,5 @@
    - + @@ -17,4 +17,4 @@
    - \ No newline at end of file + diff --git a/cartridges/int_bolt_sfra/cartridge/templates/default/product/components/addToCartButtonExtension.isml b/cartridges/int_bolt_sfra/cartridge/templates/default/product/components/addToCartButtonExtension.isml new file mode 100644 index 0000000..0270df2 --- /dev/null +++ b/cartridges/int_bolt_sfra/cartridge/templates/default/product/components/addToCartButtonExtension.isml @@ -0,0 +1,5 @@ + + + + + diff --git a/cartridges/int_bolt_sfra/cartridge/templates/default/product/components/boltProductPageButton.isml b/cartridges/int_bolt_sfra/cartridge/templates/default/product/components/boltProductPageButton.isml new file mode 100644 index 0000000..6583bea --- /dev/null +++ b/cartridges/int_bolt_sfra/cartridge/templates/default/product/components/boltProductPageButton.isml @@ -0,0 +1,24 @@ + + + var assets = require('*/cartridge/scripts/assets.js'); + assets.addJs('/js/boltProductPageButton.js'); + + + + + + + + + + + + Bolt Product Page checkout button + Optionally include JS code that calls `configureProductButton` + + diff --git a/metadata/bolt-meta-import/meta/system-objecttype-extensions.xml b/metadata/bolt-meta-import/meta/system-objecttype-extensions.xml index a51b4ec..771b6c0 100644 --- a/metadata/bolt-meta-import/meta/system-objecttype-extensions.xml +++ b/metadata/bolt-meta-import/meta/system-objecttype-extensions.xml @@ -664,18 +664,21 @@ - - Store ID - string + + Hide Bolt Button PDP + boolean + false false + false false - 0 + false + false - - Custom - + + bolt + diff --git a/package-lock.json b/package-lock.json index 7ac2a31..563a068 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bolt-demandware", - "version": "21.4.19", + "version": "22.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1407,6 +1407,16 @@ "lodash.isstring": "^3.0.1" } }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -1428,6 +1438,12 @@ "@types/unist": "*" } }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, "@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -1440,6 +1456,12 @@ "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", "dev": true }, + "@types/node": { + "version": "18.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", + "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==", + "dev": true + }, "@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", @@ -2070,13 +2092,63 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", "dev": true, "requires": { - "follow-redirects": "^1.14.8" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } } }, "babel-eslint": { @@ -2933,44 +3005,6 @@ } } }, - "cldr-data": { - "version": "36.0.1", - "resolved": "https://registry.npmjs.org/cldr-data/-/cldr-data-36.0.1.tgz", - "integrity": "sha512-74leCbj4QIBno+a8MVwO4Kiqv4J1PXDcFhlgOhh86rnLljppLxxi8odVeMjqFsnEG2xxCu98P4iO9mkNXn5v9Q==", - "dev": true, - "requires": { - "cldr-data-downloader": "1.0.0-1", - "glob": "5.x.x" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "cldr-data-downloader": { - "version": "1.0.0-1", - "resolved": "https://registry.npmjs.org/cldr-data-downloader/-/cldr-data-downloader-1.0.0-1.tgz", - "integrity": "sha512-jskJncLkJlkBCdqdgzLSV9sOOLyEdeVOtwJOwVwRyliVJ+4822KZWvfaD620c9Lk7el3auwFDg92FXYjGA5BhQ==", - "dev": true, - "requires": { - "axios": "^0.26.0", - "mkdirp": "0.5.5", - "nopt": "3.0.x", - "q": "1.0.1", - "yauzl": "^2.10.0" - } - }, "cldrjs": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.5.tgz", @@ -2983,6 +3017,92 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "clean-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", + "dev": true, + "requires": { + "del": "^4.1.1" + }, + "dependencies": { + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "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 + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3110,6 +3230,25 @@ "wrap-ansi": "^7.0.0" } }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, "clone-regexp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", @@ -3456,53 +3595,61 @@ } }, "css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", "dev": true, "requires": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" }, "dependencies": { - "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "minimist": "^1.2.0" } }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true } } }, @@ -3518,6 +3665,16 @@ "nth-check": "~1.0.1" } }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, "css-tree": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", @@ -5068,6 +5225,12 @@ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -5077,15 +5240,6 @@ "reusify": "^1.0.4" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -6112,12 +6266,34 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", "dev": true }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -6136,6 +6312,12 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true + }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -7118,12 +7300,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, "known-css-properties": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", @@ -7914,6 +8090,30 @@ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, + "mini-css-extract-plugin": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", + "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -8296,12 +8496,6 @@ "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", "dev": true }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -9905,12 +10099,6 @@ "sha.js": "^2.4.8" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -10069,38 +10257,94 @@ "dev": true }, "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } }, "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==", "dev": true, "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } } }, "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.4" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } } }, "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==", "dev": true, "requires": { - "icss-utils": "^5.0.0" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } } }, "postcss-resolve-nested-selector": { @@ -10345,12 +10589,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "q": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", - "integrity": "sha512-18MnBaCeBX9sLRUdtxz/6onlb7wLzFxCylklyO8n27y5JxJYaGLPu4ccyc5zih58SpEzY8QmfwaWqguqXU6Y+A==", - "dev": true - }, "qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -10891,6 +11129,17 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sass": { + "version": "1.59.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.3.tgz", + "integrity": "sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, "sass-graph": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", @@ -11046,37 +11295,43 @@ } }, "sass-loader": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.3.1.tgz", - "integrity": "sha512-y2aBdtYkbqorVavkC3fcJIUDGIegzDWPn3/LAFhsf3G+MzPKTJx37sROf5pXtUeggSVbNbmfj8TgRaSLMelXRA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", + "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", "dev": true, "requires": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^6.3.0" }, "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "minimist": "^1.2.0" } }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -12000,6 +12255,23 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -12732,16 +13004,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - } - }, "style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", @@ -15075,16 +15337,6 @@ "is-plain-obj": "^2.1.0" } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "yazl": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",