UNPKG

ngx-cookie

Version:

Implementation of Angular 1.x $cookies service to Angular

115 lines 15.7 kB
export function isNil(obj) { return obj === undefined || obj === null; } export function isPresent(obj) { return !isNil(obj); } export function isString(obj) { return typeof obj === 'string'; } // noinspection JSUnusedGlobalSymbols // eslint-disable-next-line @typescript-eslint/no-explicit-any export function isEmpty(value) { if (isNil(value)) { return true; } if (value === {}) { return true; } if (isString(value) && value.length === 0) { return true; } if (Array.isArray(value) && value.length === 0) { return true; } if (typeof value !== 'boolean' && !value) { return true; } // noinspection RedundantIfStatementJS if (typeof value === 'object' && Object.keys(value).length === 0 && value.constructor === Object) { return true; } return false; } export function mergeOptions(oldOptions, newOptions) { if (!newOptions) { return oldOptions; } return { path: isPresent(newOptions.path) ? newOptions.path : oldOptions.path, domain: isPresent(newOptions.domain) ? newOptions.domain : oldOptions.domain, expires: isPresent(newOptions.expires) ? newOptions.expires : oldOptions.expires, secure: isPresent(newOptions.secure) ? newOptions.secure : oldOptions.secure, sameSite: isPresent(newOptions.sameSite) ? newOptions.sameSite : oldOptions.sameSite, httpOnly: isPresent(newOptions.httpOnly) ? newOptions.httpOnly : oldOptions.httpOnly, storeUnencoded: isPresent(newOptions.storeUnencoded) ? newOptions.storeUnencoded : oldOptions.storeUnencoded }; } export function parseCookieString(currentCookieString) { let lastCookies = {}; let lastCookieString = ''; let cookieArray; let cookie; let i; let index; let name; if (currentCookieString !== lastCookieString) { lastCookieString = currentCookieString; cookieArray = lastCookieString.split(';'); lastCookies = {}; for (i = 0; i < cookieArray.length; i++) { cookie = cookieArray[i]; index = cookie.indexOf('='); if (index > 0) { // ignore nameless cookies name = safeDecodeURIComponent((cookie.substring(0, index)).trim()); // the first value that is seen for a cookie is the most // specific one. values for the same cookie name that // follow are for less specific paths. if (isNil((lastCookies)[name])) { lastCookies[name] = safeDecodeURIComponent((cookie.substring(index + 1)).trim()); } } } } return lastCookies; } export function buildCookieString(name, value, options) { let expires = options?.expires; let val; if (isNil(value)) { expires = 'Thu, 01 Jan 1970 00:00:00 GMT'; val = ''; } else { val = value; } if (isString(expires)) { expires = new Date(expires); } const cookieValue = options?.storeUnencoded ? value : encodeURIComponent(val); let str = encodeURIComponent(name) + '=' + cookieValue; str += options?.path ? ';path=' + options.path : ''; str += options?.domain ? ';domain=' + options.domain : ''; str += expires ? ';expires=' + expires.toUTCString() : ''; str += options?.sameSite ? '; SameSite=' + options.sameSite : ''; str += options?.secure ? ';secure' : ''; str += options?.httpOnly ? '; HttpOnly' : ''; // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: // - 300 cookies // - 20 cookies per unique domain // - 4096 bytes per cookie const cookieLength = str.length + 1; if (cookieLength > 4096) { console.log('Cookie \'' + name + '\' possibly not set or overflowed because it was too large (' + cookieLength + ' > 4096 bytes)!'); } return str; } export function safeDecodeURIComponent(str) { try { return decodeURIComponent(str); } catch (e) { return str; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29va2llL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLEtBQUssQ0FBQyxHQUFZO0lBQ2hDLE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDO0FBQzNDLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVk7SUFDcEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFZO0lBQ25DLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDO0FBQ2pDLENBQUM7QUFFRCxxQ0FBcUM7QUFDckMsOERBQThEO0FBQzlELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYztJQUNwQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNoQixPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN6QyxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzlDLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0Qsc0NBQXNDO0lBQ3RDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxD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QztJQUMxRCxHQUFHLElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNqRSxHQUFHLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDeEMsR0FBRyxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRTdDLHlFQUF5RTtJQUN6RSxnQkFBZ0I7SUFDaEIsaUNBQWlDO0lBQ2pDLDBCQUEwQjtJQUMxQixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNwQyxJQUFJLFlBQVksR0FBRyxJQUFJLEVBQUU7UUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLDhEQUE4RCxHQUFHLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3JJO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEdBQVc7SUFDaEQsSUFBSTtRQUNGLE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDaEM7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sR0FBRyxDQUFDO0tBQ1o7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29va2llRGljdCwgQ29va2llT3B0aW9ucyB9IGZyb20gJy4vY29va2llLm1vZGVsJztcblxudHlwZSBFbXB0eUFycmF5ID0gbmV2ZXJbXSAmIHsgbGVuZ3RoOiAwIH07XG50eXBlIEVtcHR5T2JqZWN0ID0gUmVjb3JkPGFueSwgbmV2ZXI+O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwob2JqOiB1bmtub3duKTogb2JqIGlzIHVuZGVmaW5lZCB8IG51bGwge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVzZW50KG9iajogdW5rbm93bik6IG9iaiBpcyBFeGNsdWRlPHR5cGVvZiBvYmosIHVuZGVmaW5lZCB8IG51bGw+IHtcbiAgcmV0dXJuICFpc05pbChvYmopO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcob2JqOiB1bmtub3duKTogb2JqIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJztcbn1cblxuLy8gbm9pbnNwZWN0aW9uIEpTVW51c2VkR2xvYmFsU3ltYm9sc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgdW5kZWZpbmVkIHwgbnVsbCB8ICcnIHwgRW1wdHlBcnJheSB8IEVtcHR5T2JqZWN0IHtcbiAgaWYgKGlzTmlsKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0ge30pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gbm9pbnNwZWN0aW9uIFJlZHVuZGFudElmU3RhdGVtZW50SlNcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKG9sZE9wdGlvbnM6IENvb2tpZU9wdGlvbnMsIG5ld09wdGlvbnM/OiBDb29raWVPcHRpb25zKTogQ29va2llT3B0aW9ucyB7XG4gIGlmICghbmV3T3B0aW9ucykge1xuICAgIHJldHVybiBvbGRPcHRpb25zO1xuICB9XG4gIHJldHVybiB7XG4gICAgcGF0aDogaXNQcmVzZW50KG5ld09wdGlvbnMucGF0aCkgPyBuZXdPcHRpb25zLnBhdGggOiBvbGRPcHRpb25zLnBhdGgsXG4gICAgZG9tYWluOiBpc1ByZXNlbnQobmV3T3B0aW9ucy5kb21haW4pID8gbmV3T3B0aW9ucy5kb21haW4gOiBvbGRPcHRpb25zLmRvbWFpbixcbiAgICBleHBpcmVzOiBpc1ByZXNlbnQobmV3T3B0aW9ucy5leHBpcmVzKSA/IG5ld09wdGlvbnMuZXhwaXJlcyA6IG9sZE9wdGlvbnMuZXhwaXJlcyxcbiAgICBzZWN1cmU6IGlzUHJlc2VudChuZXdPcHRpb25zLnNlY3VyZSkgPyBuZXdPcHRpb25zLnNlY3VyZSA6IG9sZE9wdGlvbnMuc2VjdXJlLFxuICAgIHNhbWVTaXRlOiBpc1ByZXNlbnQobmV3T3B0aW9ucy5zYW1lU2l0ZSkgPyBuZXdPcHRpb25zLnNhbWVTaXRlIDogb2xkT3B0aW9ucy5zYW1lU2l0ZSxcbiAgICBodHRwT25seTogaXNQcmVzZW50KG5ld09wdGlvbnMuaHR0cE9ubHkpID8gbmV3T3B0aW9ucy5odHRwT25seSA6IG9sZE9wdGlvbnMuaHR0cE9ubHksXG4gICAgc3RvcmVVbmVuY29kZWQ6IGlzUHJlc2VudChuZXdPcHRpb25zLnN0b3JlVW5lbmNvZGVkKSA/IG5ld09wdGlvbnMuc3RvcmVVbmVuY29kZWQgOiBvbGRPcHRpb25zLnN0b3JlVW5lbmNvZGVkXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvb2tpZVN0cmluZyhjdXJyZW50Q29va2llU3RyaW5nOiBzdHJpbmcpOiBDb29raWVEaWN0IHtcbiAgbGV0IGxhc3RDb29raWVzOiBDb29raWVEaWN0ID0ge307XG4gIGxldCBsYXN0Q29va2llU3RyaW5nID0gJyc7XG4gIGxldCBjb29raWVBcnJheTogc3RyaW5nW107XG4gIGxldCBjb29raWU6IHN0cmluZztcbiAgbGV0IGk6IG51bWJlcjtcbiAgbGV0IGluZGV4OiBudW1iZXI7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmIChjdXJyZW50Q29va2llU3RyaW5nICE9PSBsYXN0Q29va2llU3RyaW5nKSB7XG4gICAgbGFzdENvb2tpZVN0cmluZyA9IGN1cnJlbnRDb29raWVTdHJpbmc7XG4gICAgY29va2llQXJyYXkgPSBsYXN0Q29va2llU3RyaW5nLnNwbGl0KCc7Jyk7XG4gICAgbGFzdENvb2tpZXMgPSB7fTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29va2llQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvb2tpZSA9IGNvb2tpZUFycmF5W2ldO1xuICAgICAgaW5kZXggPSBjb29raWUuaW5kZXhPZignPScpO1xuICAgICAgaWYgKGluZGV4ID4gMCkgeyAgLy8gaWdub3JlIG5hbWVsZXNzIGNvb2tpZXNcbiAgICAgICAgbmFtZSA9IHNhZmVEZWNvZGVVUklDb21wb25lbnQoKGNvb2tpZS5zdWJzdHJpbmcoMCwgaW5kZXgpKS50cmltKCkpO1xuICAgICAgICAvLyB0aGUgZmlyc3QgdmFsdWUgdGhhdCBpcyBzZWVuIGZvciBhIGNvb2tpZSBpcyB0aGUgbW9zdFxuICAgICAgICAvLyBzcGVjaWZpYyBvbmUuICB2YWx1ZXMgZm9yIHRoZSBzYW1lIGNvb2tpZSBuYW1lIHRoYXRcbiAgICAgICAgLy8gZm9sbG93IGFyZSBmb3IgbGVzcyBzcGVjaWZpYyBwYXRocy5cbiAgICAgICAgaWYgKGlzTmlsKChsYXN0Q29va2llcylbbmFtZV0pKSB7XG4gICAgICAgICAgbGFzdENvb2tpZXNbbmFtZV0gPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KChjb29raWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RDb29raWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb29raWVTdHJpbmcobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogQ29va2llT3B0aW9ucyk6IHN0cmluZyB7XG4gIGxldCBleHBpcmVzOiBzdHJpbmcgfCBEYXRlIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8uZXhwaXJlcztcbiAgbGV0IHZhbDogc3RyaW5nO1xuICBpZiAoaXNOaWwodmFsdWUpKSB7XG4gICAgZXhwaXJlcyA9ICdUaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVCc7XG4gICAgdmFsID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgdmFsID0gdmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmIChpc1N0cmluZyhleHBpcmVzKSkge1xuICAgIGV4cGlyZXMgPSBuZXcgRGF0ZShleHBpcmVzKTtcbiAgfVxuICBjb25zdCBjb29raWVWYWx1ZSA9IG9wdGlvbnM/LnN0b3JlVW5lbmNvZGVkID8gdmFsdWUgOiBlbmNvZGVVUklDb21wb25lbnQodmFsKTtcbiAgbGV0IHN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIGNvb2tpZVZhbHVlO1xuICBzdHIgKz0gb3B0aW9ucz8ucGF0aCA/ICc7cGF0aD0nICsgb3B0aW9ucy5wYXRoIDogJyc7XG4gIHN0ciArPSBvcHRpb25zPy5kb21haW4gPyAnO2RvbWFpbj0nICsgb3B0aW9ucy5kb21haW4gOiAnJztcbiAgc3RyICs9IGV4cGlyZXMgPyAnO2V4cGlyZXM9JyArIGV4cGlyZXMudG9VVENTdHJpbmcoKSA6ICcnO1xuICBzdHIgKz0gb3B0aW9ucz8uc2FtZVNpdGUgPyAnOyBTYW1lU2l0ZT0nICsgb3B0aW9ucy5zYW1lU2l0ZSA6ICcnO1xuICBzdHIgKz0gb3B0aW9ucz8uc2VjdXJlID8gJztzZWN1cmUnIDogJyc7XG4gIHN0ciArPSBvcHRpb25zPy5odHRwT25seSA/ICc7IEh0dHBPbmx5JyA6ICcnO1xuXG4gIC8vIHBlciBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMTA5LnR4dCBicm93c2VyIG11c3QgYWxsb3cgYXQgbWluaW11bTpcbiAgLy8gLSAzMDAgY29va2llc1xuICAvLyAtIDIwIGNvb2tpZXMgcGVyIHVuaXF1ZSBkb21haW5cbiAgLy8gLSA0MDk2IGJ5dGVzIHBlciBjb29raWVcbiAgY29uc3QgY29va2llTGVuZ3RoID0gc3RyLmxlbmd0aCArIDE7XG4gIGlmIChjb29raWVMZW5ndGggPiA0MDk2KSB7XG4gICAgY29uc29sZS5sb2coJ0Nvb2tpZSBcXCcnICsgbmFtZSArICdcXCcgcG9zc2libHkgbm90IHNldCBvciBvdmVyZmxvd2VkIGJlY2F1c2UgaXQgd2FzIHRvbyBsYXJnZSAoJyArIGNvb2tpZUxlbmd0aCArICcgPiA0MDk2IGJ5dGVzKSEnKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FmZURlY29kZVVSSUNvbXBvbmVudChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuIl19