From 6578db8ba8958d9bc3b51c81d18bf84b2138500d Mon Sep 17 00:00:00 2001 From: Rudakov Bordan Date: Mon, 4 Oct 2021 22:06:53 +0500 Subject: [PATCH] feat: add cookie drivers support --- .gitignore | 1 + src/cookie-storage.ts | 14 +++++----- src/drivers/browser-cookie-driver.ts | 15 +++++++++++ src/drivers/cookie-driver.ts | 4 +++ test/drivers/browser-cookie-driver.ts | 37 +++++++++++++++++++++++++++ test/index.ts | 2 ++ 6 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 src/drivers/browser-cookie-driver.ts create mode 100644 src/drivers/cookie-driver.ts create mode 100644 test/drivers/browser-cookie-driver.ts diff --git a/.gitignore b/.gitignore index 8500f88..2e17722 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.log .envrc .tmp +.idea coverage lib node_modules diff --git a/src/cookie-storage.ts b/src/cookie-storage.ts index 0facb6a..b68f79f 100644 --- a/src/cookie-storage.ts +++ b/src/cookie-storage.ts @@ -2,11 +2,14 @@ import { CookieOptions } from "./cookie-options"; import { formatCookie } from "./format-cookie"; import { parseCookies } from "./parse-cookies"; import { Storage } from "./storage"; +import { CookieDriver } from "./drivers/cookie-driver"; +import { BrowserCookieDriver } from "./drivers/browser-cookie-driver"; export class CookieStorage implements Storage { private _defaultOptions: CookieOptions; + private _driver: CookieDriver; - constructor(defaultOptions?: CookieOptions) { + constructor(defaultOptions?: CookieOptions, driver?: CookieDriver) { this._defaultOptions = { domain: null, expires: null, @@ -14,6 +17,7 @@ export class CookieStorage implements Storage { secure: false, ...defaultOptions, }; + this._driver = driver || new BrowserCookieDriver(); if (typeof Proxy !== "undefined") // eslint-disable-next-line @typescript-eslint/no-use-before-define return new Proxy(this, cookieStorageHandler); @@ -62,15 +66,11 @@ export class CookieStorage implements Storage { } private _getCookie(): string { - return typeof document === "undefined" - ? "" - : typeof document.cookie === "undefined" - ? "" - : document.cookie; + return this._driver.getCookies(); } private _setCookie(value: string): void { - document.cookie = value; + this._driver.setCookies(value); } // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/drivers/browser-cookie-driver.ts b/src/drivers/browser-cookie-driver.ts new file mode 100644 index 0000000..49937d2 --- /dev/null +++ b/src/drivers/browser-cookie-driver.ts @@ -0,0 +1,15 @@ +import { CookieDriver } from "./cookie-driver"; + +export class BrowserCookieDriver implements CookieDriver { + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + setCookies(cookies: string) { + document.cookie = cookies; + } + getCookies(): string { + return typeof document === "undefined" + ? "" + : typeof document.cookie === "undefined" + ? "" + : document.cookie; + } +} diff --git a/src/drivers/cookie-driver.ts b/src/drivers/cookie-driver.ts new file mode 100644 index 0000000..777c26d --- /dev/null +++ b/src/drivers/cookie-driver.ts @@ -0,0 +1,4 @@ +export interface CookieDriver { + setCookies(cookies: string): void; + getCookies(): string; +} diff --git a/test/drivers/browser-cookie-driver.ts b/test/drivers/browser-cookie-driver.ts new file mode 100644 index 0000000..ce624bd --- /dev/null +++ b/test/drivers/browser-cookie-driver.ts @@ -0,0 +1,37 @@ +import assert from "power-assert"; +import { Test, fixture, group, test } from "../test-helpers"; +import { BrowserCookieDriver } from "../../src/drivers/browser-cookie-driver"; + +const dummyDocument = { + after: (): void => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + delete (global as any).document; + }, + before: (): void => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (global as any).document = {}; + }, +}; + +const tests1: Test[] = group("BrowserCookieDriver > ", [ + test( + "getCookies", + fixture(dummyDocument, () => { + document.cookie = "a=1;b=2"; + const storage = new BrowserCookieDriver(); + assert(document.cookie === storage.getCookies()); + }) + ), + test( + "setCookies", + fixture(dummyDocument, () => { + const cookies = "a=1;b=2"; + const storage = new BrowserCookieDriver(); + storage.setCookies(cookies); + assert(document.cookie === storage.getCookies()); + assert(document.cookie === cookies); + }) + ), +]); + +export { tests1 as tests }; diff --git a/test/index.ts b/test/index.ts index 739d9e7..5430bbd 100644 --- a/test/index.ts +++ b/test/index.ts @@ -2,6 +2,7 @@ import { tests as cookieStorageTests } from "./cookie-storage"; import { tests as cookieStorageIndexerTests } from "./cookie-storage-indexer"; import { tests as formatCookieTests } from "./format-cookie"; import { tests as parseCookiesTests } from "./parse-cookies"; +import { tests as browserCookieDriver } from "./drivers/browser-cookie-driver"; import { Test, group, run } from "./test-helpers"; const tests1: Test[] = group("", [ @@ -9,6 +10,7 @@ const tests1: Test[] = group("", [ ...cookieStorageTests, ...formatCookieTests, ...parseCookiesTests, + ...browserCookieDriver, ]); run(tests1).catch(() => process.exit(1));