/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'jquery',
'mage/mage',
'js-cookie/cookie-wrapper'
], function ($) {
'use strict';
/**
* Helper for cookies manipulation
* @returns {CookieHelper}
* @constructor
*/
var CookieHelper = function () {
/**
* Cookie default values.
* @type {Object}
*/
this.defaults = {
expires: null,
path: '/',
domain: null,
secure: false,
lifetime: null,
samesite: 'lax'
};
/**
* Calculate cookie expiration date based on its lifetime.
* @param {Object} options - Cookie option values
* @return {Date|null} Calculated cookie expiration date or null if no lifetime provided.
* @private
*/
function lifetimeToExpires(options, defaults) {
var expires,
lifetime;
lifetime = options.lifetime || defaults.lifetime;
if (lifetime && lifetime > 0) {
expires = options.expires || new Date();
return new Date(expires.getTime() + lifetime * 1000);
}
return null;
}
/**
* Set a cookie's value by cookie name based on optional cookie options.
* @param {String} name - The name of the cookie.
* @param {String} value - The cookie's value.
* @param {Object} options - Optional options (e.g. lifetime, expires, path, etc.)
*/
this.set = function (name, value, options) {
var expires,
path,
domain,
secure,
samesite;
options = $.extend({}, this.defaults, options || {});
expires = lifetimeToExpires(options, this.defaults) || options.expires;
path = options.path;
domain = options.domain;
secure = options.secure;
samesite = options.samesite;
document.cookie = name + '=' + encodeURIComponent(value) +
(expires ? '; expires=' + expires.toUTCString() : '') +
(path ? '; path=' + path : '') +
(domain ? '; domain=' + domain : '') +
(secure ? '; secure' : '') +
'; samesite=' + (samesite ? samesite : 'lax');
};
/**
* Get a cookie's value by cookie name.
* @param {String} name - The name of the cookie.
* @return {(null|String)}
*/
this.get = function (name) {
var arg = name + '=',
aLength = arg.length,
cookie = document.cookie,
cLength = cookie.length,
i = 0,
j = 0;
while (i < cLength) {
j = i + aLength;
if (cookie.substring(i, j) === arg) {
return this.getCookieVal(j);
}
i = cookie.indexOf(' ', i) + 1;
if (i === 0) {
break;
}
}
return null;
};
/**
* Clear a cookie's value by name.
* @param {String} name - The name of the cookie being cleared.
*/
this.clear = function (name) {
if (this.get(name)) {
this.set(name, '', {
expires: new Date('Jan 01 1970 00:00:01 GMT')
});
}
};
/**
* Return URI decoded cookie component value (e.g. expires, path, etc.) based on a
* numeric offset in the document's cookie value.
* @param {Number} offset - Offset into the document's cookie value.
* @return {String}
*/
this.getCookieVal = function (offset) {
var cookie = document.cookie,
endstr = cookie.indexOf(';', offset);
if (endstr === -1) {
endstr = cookie.length;
}
return decodeURIComponent(cookie.substring(offset, endstr));
};
return this;
};
$.extend(true, $, {
mage: {
cookies: new CookieHelper()
}
});
return function (pageOptions) {
$.extend($.mage.cookies.defaults, pageOptions);
$.extend($.cookie.defaults, $.mage.cookies.defaults);
};
});
|