@modern-kit/utils
Version:
1 lines • 17.4 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../src/storage/storageManager/index.ts"],"sourcesContent":["import { parseJSON } from '../../common/parseJSON';\n\ninterface StorageData<T> {\n key: keyof T;\n value: T[keyof T];\n}\n\n/**\n * @description 스토리지 관리 클래스\n *\n * @template T - 스토리지에 저장할 데이터의 타입\n * @param {'localStorage' | 'sessionStorage'} type - 스토리지 타입 (localStorage 또는 sessionStorage)\n *\n * @method setItem - 스토리지에 단일 데이터를 저장합니다.\n * @method getItem - 스토리지에서 단일 데이터를 가져옵니다.\n * @method setItems - 스토리지에 여러 데이터를 한번에 저장합니다.\n * @method getItems - 스토리지에서 여러 데이터를 한번에 가져옵니다.\n * @method removeItem - 스토리지에서 단일 데이터를 삭제합니다.\n * @method removeItems - 스토리지에서 여러 데이터를 한번에 삭제합니다.\n *\n * @method keys - 스토리지에 저장된 모든 키를 반환합니다.\n * @method values - 스토리지에 저장된 모든 값을 반환합니다.\n * @method entries - 스토리지에 저장된 모든 키-값 쌍을 반환합니다.\n * @method clear - 스토리지의 모든 데이터를 삭제합니다.\n * @method size - 스토리지에 저장된 데이터의 개수를 반환합니다.\n *\n * @method ownKeys - 현재 인스턴스가 관리하는 키를 반환합니다.\n * @method ownValues - 현재 인스턴스가 관리하는 값을 반환합니다.\n * @method ownEntries - 현재 인스턴스가 관리하는 키-값 쌍을 반환합니다.\n * @method ownClear - 현재 인스턴스가 관리하는 데이터를 스토리지에서 삭제합니다.\n * @method ownSize - 현재 인스턴스가 관리하는 데이터의 개수를 반환합니다.\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * storage.getItem('name'); // 'John'\n * storage.removeItem('name');\n */\nexport class StorageManager<T extends Record<string, any>> {\n private storageType: 'localStorage' | 'sessionStorage';\n private managedKeys: Set<keyof T>;\n\n constructor(type: 'localStorage' | 'sessionStorage') {\n this.storageType = type;\n this.managedKeys = new Set();\n }\n\n private get storage(): Window['localStorage'] | Window['sessionStorage'] {\n if (typeof window === 'undefined') {\n throw new Error('Storage를 지원하는 환경이 아닙니다');\n }\n return window[this.storageType];\n }\n\n /**\n * @description 스토리지에 단일 데이터를 저장합니다.\n *\n * @param {keyof T} key - 저장할 데이터의 키\n * @param {T[keyof T]} value - 저장할 데이터의 값\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n * storage.setItem('name', 'John');\n */\n setItem<K extends keyof T>(key: K, value: T[K]): void {\n if (value == null) {\n return;\n }\n\n this.storage.setItem(key as string, JSON.stringify(value));\n this.managedKeys.add(key);\n }\n\n /**\n * @description 스토리지에 여러 데이터를 한번에 저장합니다.\n *\n * key가 같은 경우 뒤에 오는 데이터가 덮어씁니다.\n *\n * @param {StorageData<T>[]} data - 저장할 데이터의 배열\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n * storage.setItems([{ key: 'name', value: 'John' }, { key: 'age', value: 30 }]);\n */\n setItems(data: StorageData<T>[]): void {\n data.forEach(({ key, value }) => {\n this.setItem(key, value);\n });\n }\n\n /**\n * @description 스토리지에 저장된 단일 데이터를 가져옵니다.\n *\n * @param {keyof T} key - 가져올 데이터의 키\n *\n * @returns {T[keyof T] | null} - 가져온 데이터의 값\n *\n * @throws {Error} - 데이터를 가져오는데 실패할 경우 오류를 발생시킵니다.\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n * storage.getItem('name'); // 'John'\n * // type: string | null\n */\n getItem<K extends keyof T>(key: K): T[K] | null {\n try {\n const getItem = this.storage.getItem(key as string);\n\n if (getItem == null || getItem === 'undefined') {\n return null;\n }\n\n return parseJSON(getItem);\n } catch (err) {\n throw new Error(\n `\"${String(key)}\" 아이템을 가져오는데 실패했습니다: ${err}`\n );\n }\n }\n\n /**\n * @description 스토리지에 저장된 여러 데이터를 한번에 가져옵니다.\n *\n * @template K - 가져올 데이터의 키 타입\n * @param {K[]} keys - 가져올 데이터의 키 배열\n *\n * @returns {{ key: K; value: T[K] | null }[]} - 가져온 데이터의 값 배열. 매칭되는 키에 대해 데이터가 없으면 null을 반환합니다.\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n * storage.getItems(['name', 'age']); // [{ key: 'name', value: 'John' }, { key: 'age', value: 30 }]\n * // type: {\n * // key: \"name\" | \"age\";\n * // value: string | number | null;\n * // }[]\n */\n getItems<K extends keyof T>(keys: K[]): { key: K; value: T[K] | null }[] {\n return keys.map((key) => {\n return {\n key,\n value: this.getItem(key),\n };\n });\n }\n\n /**\n * @description 스토리지에 저장된 데이터를 삭제합니다.\n *\n * @param {keyof T} key - 삭제할 데이터의 키\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n * storage.removeItem('name');\n */\n removeItem<K extends keyof T>(key: K): void {\n this.storage.removeItem(key as string);\n this.managedKeys.delete(key);\n }\n\n /**\n * @description 스토리지에 저장된 여러 데이터를 한번에 삭제합니다.\n *\n * @param {keyof T[]} keys - 삭제할 데이터의 키 배열\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n * storage.removeItems(['name', 'age']);\n */\n removeItems<K extends keyof T>(keys: K[]): void {\n keys.forEach((key) => {\n this.removeItem(key);\n });\n }\n\n /**\n * @description 스토리지에 저장된 데이터가 있는지 확인합니다.\n *\n * @param {keyof T} key - 확인할 데이터의 키\n *\n * @returns {boolean} - 데이터가 있으면 true, 없으면 false\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.hasItem('name'); // true, 스토리지에 저장된 데이터가 있음\n * storage.hasItem('age'); // true, 스토리지에 저장된 데이터가 있음\n */\n hasItem<K extends keyof T>(key: K): boolean {\n return this.getItem(key) != null;\n }\n\n /**\n * @description 스토리지에 저장된 모든 키를 반환합니다.\n *\n * @returns {keyof T[]} - StorageManager 인스턴스에 관리하는 모든 키의 배열\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.keys(); // ['name', 'age'], 스토리지에 저장된 모든 키 2개\n */\n keys(): (keyof T)[] {\n const keys: (keyof T)[] = [];\n\n for (let i = 0; i < this.storage.length; i++) {\n const key = this.storage.key(i);\n if (key) {\n keys.push(key as keyof T);\n }\n }\n return keys;\n }\n\n /**\n * @description 스토리지에 저장된 모든 값을 반환합니다.\n *\n * @returns {T[keyof T][]} - 스토리지에 저장된 모든 값의 배열\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.values(); // ['John', 30], 스토리지에 저장된 모든 값 2개\n */\n values(): (T[keyof T] | null)[] {\n const keys = this.keys();\n return keys.map((key) => this.getItem(key));\n }\n\n /**\n * @description 스토리지에 저장된 모든 키-값 쌍(entries)을 반환합니다.\n *\n * @returns {[keyof T, T[keyof T] | null][]} - 스토리지에 저장된 모든 키-값 쌍의 배열\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.entries(); // [['name', 'John'], ['age', 30]], 스토리지에 저장된 모든 키-값 쌍 2개\n */\n entries(): [keyof T, T[keyof T] | null][] {\n const keys = this.keys();\n return keys.map((key) => [key, this.getItem(key)]);\n }\n\n /**\n * @description 스토리지에 저장된 모든 데이터를 스토리지에서 삭제합니다.\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.clear();\n */\n clear(): void {\n this.storage.clear();\n }\n\n /**\n * @description 스토리지에 저장된 모든 데이터의 수를 반환합니다.\n *\n * @returns {number} - 스토리지에 저장된 모든 데이터의 수\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.size; // 2, 스토리지에 저장된 모든 데이터의 수 2개\n */\n size(): number {\n return this.storage.length;\n }\n\n /**\n * @description 현재 인스턴스가 관리하는 키들만 반환합니다.\n *\n * @returns {(keyof T)[]} - 현재 인스턴스가 관리하는 키의 배열\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.ownKeys(); // ['name'], 인스턴스가 관리하는 키 1개\n * storage.keys(); // ['name', 'age'], 스토리지에 저장된 모든 키 2개\n */\n ownKeys(): (keyof T)[] {\n return Array.from(this.managedKeys);\n }\n\n /**\n * @description 현재 인스턴스가 관리하는 값들만 반환합니다.\n *\n * @returns {(T[keyof T] | null)[]} - 현재 인스턴스가 관리하는 값의 배열\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.ownValues(); // ['John'], 인스턴스가 관리하는 값 1개\n * storage.values(); // ['John', 30], 스토리지에 저장된 모든 값 2개\n */\n ownValues(): (T[keyof T] | null)[] {\n return Array.from(this.managedKeys).map((key) => this.getItem(key));\n }\n\n /**\n * @description 현재 인스턴스가 관리하는 키-값 쌍들만 반환합니다.\n *\n * @returns {[keyof T, T[keyof T] | null][]} - 현재 인스턴스가 관리하는 키-값 쌍의 배열\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.ownEntries(); // [['name', 'John']], 인스턴스가 관리하는 키-값 쌍 1개\n */\n ownEntries(): [keyof T, T[keyof T] | null][] {\n return Array.from(this.managedKeys).map((key) => [key, this.getItem(key)]);\n }\n\n /**\n * @description 현재 인스턴스가 관리하는 데이터를 스토리지에서 삭제합니다.\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.ownClear();\n *\n * storage.ownKeys(); // []\n * storage.keys(); // ['age']\n */\n ownClear(): void {\n const keys = this.ownKeys();\n keys.forEach((key) => {\n this.storage.removeItem(key as string);\n });\n this.managedKeys.clear();\n }\n\n /**\n * @description 현재 인스턴스가 관리하는 데이터의 수를 반환합니다.\n *\n * @returns {number} - 현재 인스턴스가 관리하는 데이터의 수\n *\n * @example\n * const storage = new StorageManager<{ name: string, age: number }>('localStorage');\n *\n * storage.setItem('name', 'John');\n * localStorage.setItem('age', '30');\n *\n * storage.ownSize(); // 1, 인스턴스가 관리하는 데이터의 수 1개\n * storage.size(); // 2, 스토리지에 저장된 모든 데이터의 수 2개\n */\n ownSize(): number {\n return this.managedKeys.size;\n }\n}\n"],"names":[],"mappings":"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"}