@modern-kit/utils
Version:
321 lines (318 loc) • 10.3 kB
JavaScript
import { parseJSON } from '../../common/parseJSON/index.mjs';
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 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;
}
}
export { StorageManager };
//# sourceMappingURL=index.mjs.map