123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- /**
- * @file
- * Defines a backwards-compatible shim for jquery.cookie.
- */
- /**
- * The core/js-cookie library object.
- *
- * @global
- *
- * @var {object} Cookies
- */
- (($, Drupal, cookies) => {
- /**
- * Determines if an object is a function.
- *
- * @param {Object} obj
- * The object to check.
- *
- * @return {boolean}
- * True if the object is a function.
- */
- const isFunction = obj =>
- Object.prototype.toString.call(obj) === '[object Function]';
- /**
- * Decodes cookie value for compatibility with jquery.cookie.
- *
- * @param {string} value
- * The cookie value to parse.
- * @param {boolean} parseJson
- * Whether cookie value should be parsed from JSON.
- *
- * @return {string}
- * The cookie value for the reader to return.
- */
- const parseCookieValue = (value, parseJson) => {
- if (value.indexOf('"') === 0) {
- value = value
- .slice(1, -1)
- .replace(/\\"/g, '"')
- .replace(/\\\\/g, '\\');
- }
- try {
- value = decodeURIComponent(value.replace(/\+/g, ' '));
- return parseJson ? JSON.parse(value) : value;
- } catch (e) {
- // Exceptions on JSON parsing should be ignored.
- }
- };
- /**
- * Wraps the cookie value to support unsanitized values.
- *
- * Decoding strings is the job of the converter when using js-cookie, and
- * the shim uses the same decode function as that library when the deprecated
- * raw option is not used.
- *
- * @param {string} cookieValue
- * The cookie value.
- * @param {string} cookieName
- * The cookie name.
- * @param {reader~converterCallback} converter
- * A function that takes the cookie value for further processing.
- * @param {boolean} readUnsanitized
- * Uses the unsanitized value when set to true.
- * @param {boolean} parseJson
- * Whether cookie value should be parsed from JSON.
- *
- * @return {string}
- * The cookie value that js-cookie will return.
- */
- const reader = (
- cookieValue,
- cookieName,
- converter,
- readUnsanitized,
- parseJson,
- ) => {
- const value = readUnsanitized
- ? cookieValue
- : parseCookieValue(cookieValue, parseJson);
- if (converter !== undefined && isFunction(converter)) {
- return converter(value, cookieName);
- }
- return value;
- };
- /**
- * Gets or sets a browser cookie.
- *
- * @example
- * // Returns 'myCookie=myCookieValue'.
- * $.cookie('myCookie', 'myCookieValue');
- * @example
- * // Returns 'myCookieValue'.
- * $.cookie('myCookie');
- *
- * @example
- * // Returns the literal URI-encoded value of {"key": "value"} as the cookie
- * // value along with the path as in the above example.
- * $.cookie('myCookie', { key: 'value' });
- * @example
- * $.cookie.json = true;
- * // Returns { key: 'value' }.
- * $.cookie('myCookie');
- *
- * @param {string} key
- * The name of the cookie.
- * @param {string|Object|Function|undefined} value
- * A js-cookie converter callback when used as a getter. This callback must
- * be a function when using this shim for backwards-compatibility with
- * jquery.cookie. When used as a setter, value is the string or JSON object
- * to be used as the cookie value.
- * @param {Object|undefined} options
- * Overrides the default options when used as a setter. See the js-cookie
- * library README.md file for details.
- *
- * @return {string}
- * Returns the cookie name, value, and other properties based on the
- * return value of the document.cookie setter.
- *
- * @see https://www.drupal.org/node/3104677
- * @see https://github.com/js-cookie/js-cookie/blob/v3.0.0-rc.0/README.md
- */
- $.cookie = (key, value = undefined, options = undefined) => {
- // Key should be only encoded if it exists and when not in a raw mode.
- key = key && !$.cookie.raw ? encodeURIComponent(key) : key;
- if (value !== undefined && !isFunction(value)) {
- // The caller is setting a cookie value and not trying to retrieve the
- // cookie value using a converter callback.
- const attributes = Object.assign({}, $.cookie.defaults, options);
- if (typeof attributes.expires === 'string' && attributes.expires !== '') {
- attributes.expires = new Date(attributes.expires);
- }
- const cookieSetter = cookies.withConverter({
- write: cookieValue => encodeURIComponent(cookieValue),
- });
- value =
- $.cookie.json && !$.cookie.raw ? JSON.stringify(value) : String(value);
- return cookieSetter.set(key, value, attributes);
- }
- // Use either js-cookie or pass in a converter to get the raw cookie value,
- // which has security implications, but remains in place for
- // backwards-compatibility.
- const userProvidedConverter = value;
- const cookiesShim = cookies.withConverter({
- read: (cookieValue, cookieName) =>
- reader(
- cookieValue,
- cookieName,
- userProvidedConverter,
- $.cookie.raw,
- $.cookie.json,
- ),
- });
- if (key !== undefined) {
- return cookiesShim.get(key);
- }
- const results = cookiesShim.get();
- Object.keys(results).forEach(resultKey => {
- if (results[resultKey] === undefined) {
- delete results[resultKey];
- }
- });
- return results;
- };
- /**
- * @prop {Object} defaults
- * The default options when setting a cookie.
- * @prop {string} defaults.path
- * The default path for the cookie is ''.
- * @prop {undefined} defaults.expires
- * There is no default value for the expires option. The default expiration
- * is set to an empty string.
- */
- $.cookie.defaults = Object.assign({ path: '' }, cookies.defaults);
- /**
- * @prop {boolean} json
- * True if the cookie value should be parsed as JSON.
- */
- $.cookie.json = false;
- /**
- * @prop {boolean} json
- * True if the cookie value should be returned as-is without decoding
- * URI entities. In jquery.cookie, this also would not encode the cookie
- * name, but js-cookie does not allow this.
- */
- $.cookie.raw = false;
- /**
- * Removes a browser cookie.
- *
- * @param {string} key
- * The name of the cookie.
- * @param {Object} options
- * Optional options. See the js-cookie library README.md for more details.
- *
- * @return {boolean}
- * Returns true when the cookie is successfully removed.
- *
- * @see https://www.drupal.org/node/3104677
- * @see https://github.com/js-cookie/js-cookie/blob/v3.0.0-rc.0/README.md
- */
- $.removeCookie = (key, options) => {
- cookies.remove(key, Object.assign({}, $.cookie.defaults, options));
- return !cookies.get(key);
- };
- })(jQuery, Drupal, window.Cookies);
|