UNPKG

@modern-kit/utils

Version:
323 lines (319 loc) 10.4 kB
'use strict'; var commonParseJSON = require('../../common/parseJSON/index.cjs'); class StorageManager { constructor(type) { this.storageType = type; this.managedKeys = /* @__PURE__ */ new Set(); } get storage() { if (typeof window === "undefined") { throw new Error("Storage\uB97C \uC9C0\uC6D0\uD558\uB294 \uD658\uACBD\uC774 \uC544\uB2D9\uB2C8\uB2E4"); } return window[this.storageType]; } /** * @description 스토리지에 단일 데이터를 저장합니다. * * @param {keyof T} key - 저장할 데이터의 키 * @param {T[keyof T]} value - 저장할 데이터의 값 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * storage.setItem('name', 'John'); */ setItem(key, value) { if (value == null) { return; } this.storage.setItem(key, JSON.stringify(value)); this.managedKeys.add(key); } /** * @description 스토리지에 여러 데이터를 한번에 저장합니다. * * key가 같은 경우 뒤에 오는 데이터가 덮어씁니다. * * @param {StorageData<T>[]} data - 저장할 데이터의 배열 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * storage.setItems([{ key: 'name', value: 'John' }, { key: 'age', value: 30 }]); */ setItems(data) { data.forEach(({ key, value }) => { this.setItem(key, value); }); } /** * @description 스토리지에 저장된 단일 데이터를 가져옵니다. * * @param {keyof T} key - 가져올 데이터의 키 * * @returns {T[keyof T] | null} - 가져온 데이터의 값 * * @throws {Error} - 데이터를 가져오는데 실패할 경우 오류를 발생시킵니다. * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * storage.getItem('name'); // 'John' * // type: string | null */ getItem(key) { try { const getItem = this.storage.getItem(key); if (getItem == null || getItem === "undefined") { return null; } return commonParseJSON.parseJSON(getItem); } catch (err) { throw new Error( `"${String(key)}" \uC544\uC774\uD15C\uC744 \uAC00\uC838\uC624\uB294\uB370 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4: ${err}` ); } } /** * @description 스토리지에 저장된 여러 데이터를 한번에 가져옵니다. * * @template K - 가져올 데이터의 키 타입 * @param {K[]} keys - 가져올 데이터의 키 배열 * * @returns {{ key: K; value: T[K] | null }[]} - 가져온 데이터의 값 배열. 매칭되는 키에 대해 데이터가 없으면 null을 반환합니다. * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * storage.getItems(['name', 'age']); // [{ key: 'name', value: 'John' }, { key: 'age', value: 30 }] * // type: { * // key: "name" | "age"; * // value: string | number | null; * // }[] */ getItems(keys) { return keys.map((key) => { return { key, value: this.getItem(key) }; }); } /** * @description 스토리지에 저장된 데이터를 삭제합니다. * * @param {keyof T} key - 삭제할 데이터의 키 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * storage.removeItem('name'); */ removeItem(key) { this.storage.removeItem(key); this.managedKeys.delete(key); } /** * @description 스토리지에 저장된 여러 데이터를 한번에 삭제합니다. * * @param {keyof T[]} keys - 삭제할 데이터의 키 배열 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * storage.removeItems(['name', 'age']); */ removeItems(keys) { keys.forEach((key) => { this.removeItem(key); }); } /** * @description 스토리지에 저장된 데이터가 있는지 확인합니다. * * @param {keyof T} key - 확인할 데이터의 키 * * @returns {boolean} - 데이터가 있으면 true, 없으면 false * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.hasItem('name'); // true, 스토리지에 저장된 데이터가 있음 * storage.hasItem('age'); // true, 스토리지에 저장된 데이터가 있음 */ hasItem(key) { return this.getItem(key) != null; } /** * @description 스토리지에 저장된 모든 키를 반환합니다. * * @returns {keyof T[]} - StorageManager 인스턴스에 관리하는 모든 키의 배열 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.keys(); // ['name', 'age'], 스토리지에 저장된 모든 키 2개 */ keys() { const keys = []; for (let i = 0; i < this.storage.length; i++) { const key = this.storage.key(i); if (key) { keys.push(key); } } return keys; } /** * @description 스토리지에 저장된 모든 값을 반환합니다. * * @returns {T[keyof T][]} - 스토리지에 저장된 모든 값의 배열 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.values(); // ['John', 30], 스토리지에 저장된 모든 값 2개 */ values() { const keys = this.keys(); return keys.map((key) => this.getItem(key)); } /** * @description 스토리지에 저장된 모든 키-값 쌍(entries)을 반환합니다. * * @returns {[keyof T, T[keyof T] | null][]} - 스토리지에 저장된 모든 키-값 쌍의 배열 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.entries(); // [['name', 'John'], ['age', 30]], 스토리지에 저장된 모든 키-값 쌍 2개 */ entries() { const keys = this.keys(); return keys.map((key) => [key, this.getItem(key)]); } /** * @description 스토리지에 저장된 모든 데이터를 스토리지에서 삭제합니다. * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.clear(); */ clear() { this.storage.clear(); } /** * @description 스토리지에 저장된 모든 데이터의 수를 반환합니다. * * @returns {number} - 스토리지에 저장된 모든 데이터의 수 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.size; // 2, 스토리지에 저장된 모든 데이터의 수 2개 */ size() { return this.storage.length; } /** * @description 현재 인스턴스가 관리하는 키들만 반환합니다. * * @returns {(keyof T)[]} - 현재 인스턴스가 관리하는 키의 배열 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.ownKeys(); // ['name'], 인스턴스가 관리하는 키 1개 * storage.keys(); // ['name', 'age'], 스토리지에 저장된 모든 키 2개 */ ownKeys() { return Array.from(this.managedKeys); } /** * @description 현재 인스턴스가 관리하는 값들만 반환합니다. * * @returns {(T[keyof T] | null)[]} - 현재 인스턴스가 관리하는 값의 배열 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.ownValues(); // ['John'], 인스턴스가 관리하는 값 1개 * storage.values(); // ['John', 30], 스토리지에 저장된 모든 값 2개 */ ownValues() { return Array.from(this.managedKeys).map((key) => this.getItem(key)); } /** * @description 현재 인스턴스가 관리하는 키-값 쌍들만 반환합니다. * * @returns {[keyof T, T[keyof T] | null][]} - 현재 인스턴스가 관리하는 키-값 쌍의 배열 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.ownEntries(); // [['name', 'John']], 인스턴스가 관리하는 키-값 쌍 1개 */ ownEntries() { return Array.from(this.managedKeys).map((key) => [key, this.getItem(key)]); } /** * @description 현재 인스턴스가 관리하는 데이터를 스토리지에서 삭제합니다. * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.ownClear(); * * storage.ownKeys(); // [] * storage.keys(); // ['age'] */ ownClear() { const keys = this.ownKeys(); keys.forEach((key) => { this.storage.removeItem(key); }); this.managedKeys.clear(); } /** * @description 현재 인스턴스가 관리하는 데이터의 수를 반환합니다. * * @returns {number} - 현재 인스턴스가 관리하는 데이터의 수 * * @example * const storage = new StorageManager<{ name: string, age: number }>('localStorage'); * * storage.setItem('name', 'John'); * localStorage.setItem('age', '30'); * * storage.ownSize(); // 1, 인스턴스가 관리하는 데이터의 수 1개 * storage.size(); // 2, 스토리지에 저장된 모든 데이터의 수 2개 */ ownSize() { return this.managedKeys.size; } } exports.StorageManager = StorageManager; //# sourceMappingURL=index.cjs.map