UNPKG

core-cookie

Version:

cookie

176 lines (160 loc) 4.68 kB
export interface CookieService { /** * @param name Cookie name * @returns {boolean} */ check(name: string): boolean; /** * @param name Cookie name * @returns {any} */ get(name: string): string; /** * @returns {} */ getAll(): {}; /** * @param name Cookie name * @param value Cookie value * @param expires Number of days until the cookies expires or an actual `Date` * @param path Cookie path * @param domain Cookie domain * @param secure Secure flag */ set(name: string, value: string, expires?: number | Date, path?: string, domain?: string, secure?: boolean): void; /** * @param name Cookie name * @param path Cookie path * @param domain Cookie domain */ delete(name: string, path?: string, domain?: string): void; /** * @param path Cookie path * @param domain Cookie domain */ deleteAll(path?: string, domain?: string): void; /** * @param name Cookie name * @returns {RegExp} */ getCookieRegExp?(name: string): RegExp; } export class DefaultCookieService implements CookieService { private document: any; private documentIsAccessible = true; constructor(document: any) { this.document = document; } /** * @param name Cookie name * @returns {boolean} */ check(name: string): boolean { if (!this.documentIsAccessible) { return false; } name = encodeURIComponent(name); const regExp = this.getCookieRegExp(name); const exists = regExp.test(this.document.cookie); return exists; } /** * @param name Cookie name * @returns {any} */ get(name: string): string { if (this.documentIsAccessible && this.check(name)) { name = encodeURIComponent(name); const regExp = this.getCookieRegExp(name); const result = regExp.exec(this.document.cookie); return decodeURIComponent(result[1]); } else { return ''; } } /** * @returns {} */ getAll(): any { if (!this.documentIsAccessible) { return {}; } const cookies = {}; const document = this.document; if (document.cookie && document.cookie !== '') { const split = document.cookie.split(';'); for (const item of split) { const currentCookie = item.split('='); currentCookie[0] = currentCookie[0].replace(/^ /, ''); cookies[decodeURIComponent(currentCookie[0])] = decodeURIComponent(currentCookie[1]); } } return cookies; } /** * @param name Cookie name * @param value Cookie value * @param expires Number of days until the cookies expires or an actual `Date` * @param path Cookie path * @param domain Cookie domain * @param secure Secure flag */ set(name: string, value: string, expires?: number | Date, path?: string, domain?: string, secure?: boolean): void { if (!this.documentIsAccessible) { return; } let cookieString = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';'; if (expires) { if (typeof expires === 'number') { const dateExpires = new Date(new Date().getTime() + expires * 1000 * 60 * 60 * 24); cookieString += 'expires=' + dateExpires.toUTCString() + ';'; } else { cookieString += 'expires=' + expires.toUTCString() + ';'; } } if (path) { cookieString += 'path=' + path + ';'; } if (domain) { cookieString += 'domain=' + domain + ';'; } if (secure) { cookieString += 'secure;'; } this.document.cookie = cookieString; } /** * @param name Cookie name * @param path Cookie path * @param domain Cookie domain */ delete(name: string, path?: string, domain?: string): void { if (!this.documentIsAccessible) { return; } this.set(name, '', -1, path, domain); } /** * @param path Cookie path * @param domain Cookie domain */ deleteAll(path?: string, domain?: string): void { if (!this.documentIsAccessible) { return; } const cookies = this.getAll(); for (const cookieName in cookies) { if (cookies.hasOwnProperty(cookieName)) { this.delete(cookieName, path, domain); } } } /** * @param name Cookie name * @returns {RegExp} */ getCookieRegExp(name: string): RegExp { const escapedName = name.replace(/([\[\]\{\}\(\)\|\=\;\+\?\,\.\*\^\$])/ig, '\\$1'); return new RegExp('(?:^' + escapedName + '|;\\s*' + escapedName + ')=(.*?)(?:;|$)', 'g'); } }