ngx-cookie
Version:
Implementation of Angular 1.x $cookies service to Angular
115 lines • 15.7 kB
JavaScript
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