yummies 7.1.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yummies",
3
- "version": "7.1.0",
3
+ "version": "7.3.0",
4
4
  "keywords": [
5
5
  "javascript",
6
6
  "typescript",
package/storage.cjs CHANGED
@@ -4,7 +4,7 @@ const storages = {
4
4
  session: sessionStorage,
5
5
  local: localStorage
6
6
  };
7
- const createStorageKey = (prefix, key, namespace) => `${prefix}${namespace ? `/${namespace}` : ""}/${key}`;
7
+ const createKey = (prefix, key, namespace) => `${prefix}${namespace ? `/${namespace}` : ""}/${key}`;
8
8
  const parseStorageValue = (value) => {
9
9
  if (typeof value !== "string") {
10
10
  return value;
@@ -27,10 +27,19 @@ function createStorage(storageConfig) {
27
27
  const storagePrefix = config.prefix ?? storageConfig.prefix;
28
28
  const storage = storages[storageType];
29
29
  storage.setItem(
30
- createStorageKey(storagePrefix, config.key, config.namespace),
30
+ createKey(storagePrefix, config.key, config.namespace),
31
31
  formatValueToStorage(config.value)
32
32
  );
33
33
  },
34
+ unset: (cfg) => {
35
+ const config = cfg;
36
+ const storageType = config.type ?? storageConfig.type;
37
+ const storagePrefix = config.prefix ?? storageConfig.prefix;
38
+ const storage = storages[storageType];
39
+ storage.removeItem(
40
+ createKey(storagePrefix, config.key, config.namespace)
41
+ );
42
+ },
34
43
  get: (cfg) => {
35
44
  const config = cfg;
36
45
  const storageType = config.type ?? storageConfig.type;
@@ -38,12 +47,12 @@ function createStorage(storageConfig) {
38
47
  const storage = storages[storageType];
39
48
  return parseStorageValue(
40
49
  storage.getItem(
41
- createStorageKey(storagePrefix, config.key, config.namespace)
50
+ createKey(storagePrefix, config.key, config.namespace)
42
51
  )
43
52
  ) ?? config.fallback ?? null;
44
53
  }
45
54
  };
46
55
  }
56
+ exports.createKey = createKey;
47
57
  exports.createStorage = createStorage;
48
- exports.createStorageKey = createStorageKey;
49
58
  //# sourceMappingURL=storage.cjs.map
package/storage.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"storage.cjs","sources":["../src/storage.ts"],"sourcesContent":["export type StorageType = 'session' | 'local';\n\nconst storages: Record<StorageType, Storage> = {\n session: sessionStorage,\n local: localStorage,\n};\n\nexport const createStorageKey = (\n prefix: string,\n key: string,\n namespace?: string,\n) => `${prefix}${namespace ? `/${namespace}` : ''}/${key}`;\n\nconst parseStorageValue = <V>(value: unknown): V | null => {\n if (typeof value !== 'string') {\n return value as V;\n }\n\n try {\n const parsed = JSON.parse(value);\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst formatValueToStorage = (value: unknown): string => {\n return JSON.stringify(value);\n};\n\nexport interface SetToStorageConfig<V>\n extends Omit<GetFromStorageConfig<V>, 'fallback'> {\n value: V;\n}\n\nexport interface GetFromStorageConfig<V> {\n /**\n * Ключ по которому можно получить значение из хранилища (имя ключа не полное, оно дополняется неймпспейсом проекта)\n */\n key: string;\n /**\n * Тип хранилища\n */\n type: StorageType;\n /**\n * дефолтное значение, которое будет использоваться если значения нет в хранилище\n */\n fallback?: V;\n /**\n * Доп. делитель в ключ/utils/types'е\n */\n namespace?: string;\n /**\n * Доп. делитель\n */\n prefix?: string;\n}\n\nexport type SetToStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;\n\nexport type GetFromStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;\n\nexport type StorageConfigBase = Partial<\n Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>\n>;\n\nexport interface StorageApi<BaseConfig extends StorageConfigBase> {\n set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;\n get<Value>(\n config: GetFromStorageWrappedConfig<Value, BaseConfig>,\n ): Value | null;\n}\n\n/**\n * Создает интерфейс для работы с хранилищем (localStorage, sessionStorage)\n */\nexport function createStorage<BaseConfig extends StorageConfigBase>(\n storageConfig: BaseConfig,\n): StorageApi<BaseConfig> {\n return {\n set: <Value>(cfg: SetToStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n storage.setItem(\n createStorageKey(storagePrefix, config.key, config.namespace),\n formatValueToStorage(config.value),\n );\n },\n get: <Value>(cfg: GetFromStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as GetFromStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n return (\n parseStorageValue<Value>(\n storage.getItem(\n createStorageKey(storagePrefix, config.key, config.namespace),\n ),\n ) ??\n config.fallback ??\n null\n );\n },\n } as const;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,WAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,OAAO;AACT;AAEO,MAAM,mBAAmB,CAC9B,QACA,KACA,cACG,GAAG,MAAM,GAAG,YAAY,IAAI,SAAS,KAAK,EAAE,IAAI,GAAG;AAExD,MAAM,oBAAoB,CAAI,UAA6B;AACzD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAM,uBAAuB,CAAC,UAA2B;AACvD,SAAO,KAAK,UAAU,KAAK;AAC7B;AA0EO,SAAS,cACd,eACwB;AACxB,SAAO;AAAA,IACL,KAAK,CAAQ,QAAsD;AACjE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtD,YAAM,UAAU,SAAS,WAAW;AAEpC,cAAQ;AAAA,QACN,iBAAiB,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,QAC5D,qBAAqB,OAAO,KAAK;AAAA,MAAA;AAAA,IAErC;AAAA,IACA,KAAK,CAAQ,QAAwD;AACnE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtD,YAAM,UAAU,SAAS,WAAW;AAEpC,aACE;AAAA,QACE,QAAQ;AAAA,UACN,iBAAiB,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,QAAA;AAAA,MAC9D,KAEF,OAAO,YACP;AAAA,IAEJ;AAAA,EAAA;AAEJ;;;"}
1
+ {"version":3,"file":"storage.cjs","sources":["../src/storage.ts"],"sourcesContent":["export type StorageType = 'session' | 'local';\n\nconst storages: Record<StorageType, Storage> = {\n session: sessionStorage,\n local: localStorage,\n};\n\nexport const createKey = (prefix: string, key: string, namespace?: string) =>\n `${prefix}${namespace ? `/${namespace}` : ''}/${key}`;\n\nconst parseStorageValue = <V>(value: unknown): V | null => {\n if (typeof value !== 'string') {\n return value as V;\n }\n\n try {\n const parsed = JSON.parse(value);\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst formatValueToStorage = (value: unknown): string => {\n return JSON.stringify(value);\n};\n\nexport interface SetToStorageConfig<V>\n extends Omit<GetFromStorageConfig<V>, 'fallback'> {\n value: V;\n}\n\nexport interface UnsetFromStorageConfig\n extends Omit<GetFromStorageConfig<any>, 'fallback'> {}\n\nexport interface GetFromStorageConfig<V> {\n /**\n * Ключ по которому можно получить значение из хранилища (имя ключа не полное, оно дополняется неймпспейсом проекта)\n */\n key: string;\n /**\n * Тип хранилища\n */\n type: StorageType;\n /**\n * дефолтное значение, которое будет использоваться если значения нет в хранилище\n */\n fallback?: V;\n /**\n * Доп. делитель в ключ/utils/types'е\n */\n namespace?: string;\n /**\n * Доп. делитель\n */\n prefix?: string;\n}\n\nexport type SetToStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;\n\nexport type UnsetFromStorageWrappedConfig<\n BaseConfig extends StorageConfigBase,\n> = Omit<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n> &\n Partial<\n Pick<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof UnsetFromStorageConfig>>;\n\nexport type GetFromStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;\n\nexport type StorageConfigBase = Partial<\n Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>\n>;\n\nexport interface StorageApi<BaseConfig extends StorageConfigBase> {\n set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;\n unset(config: UnsetFromStorageWrappedConfig<BaseConfig>): void;\n get<Value>(\n config: GetFromStorageWrappedConfig<Value, BaseConfig>,\n ): Value | null;\n}\n\n/**\n * Создает интерфейс для работы с хранилищем (localStorage, sessionStorage)\n */\nexport function createStorage<BaseConfig extends StorageConfigBase>(\n storageConfig: BaseConfig,\n): StorageApi<BaseConfig> {\n return {\n set: <Value>(cfg: SetToStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n storage.setItem(\n createKey(storagePrefix, config.key, config.namespace),\n formatValueToStorage(config.value),\n );\n },\n unset: <Value>(cfg: UnsetFromStorageWrappedConfig<BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n const storage = storages[storageType];\n\n storage.removeItem(\n createKey(storagePrefix, config.key, config.namespace),\n );\n },\n get: <Value>(cfg: GetFromStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as GetFromStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n return (\n parseStorageValue<Value>(\n storage.getItem(\n createKey(storagePrefix, config.key, config.namespace),\n ),\n ) ??\n config.fallback ??\n null\n );\n },\n } as const;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,WAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,OAAO;AACT;AAEO,MAAM,YAAY,CAAC,QAAgB,KAAa,cACrD,GAAG,MAAM,GAAG,YAAY,IAAI,SAAS,KAAK,EAAE,IAAI,GAAG;AAErD,MAAM,oBAAoB,CAAI,UAA6B;AACzD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAM,uBAAuB,CAAC,UAA2B;AACvD,SAAO,KAAK,UAAU,KAAK;AAC7B;AA4FO,SAAS,cACd,eACwB;AACxB,SAAO;AAAA,IACL,KAAK,CAAQ,QAAsD;AACjE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtD,YAAM,UAAU,SAAS,WAAW;AAEpC,cAAQ;AAAA,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,QACrD,qBAAqB,OAAO,KAAK;AAAA,MAAA;AAAA,IAErC;AAAA,IACA,OAAO,CAAQ,QAAmD;AAChE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AACtD,YAAM,UAAU,SAAS,WAAW;AAEpC,cAAQ;AAAA,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,MAAA;AAAA,IAEzD;AAAA,IACA,KAAK,CAAQ,QAAwD;AACnE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtD,YAAM,UAAU,SAAS,WAAW;AAEpC,aACE;AAAA,QACE,QAAQ;AAAA,UACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,QAAA;AAAA,MACvD,KAEF,OAAO,YACP;AAAA,IAEJ;AAAA,EAAA;AAEJ;;;"}
package/storage.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  type StorageType = 'session' | 'local';
2
- declare const createStorageKey: (prefix: string, key: string, namespace?: string) => string;
2
+ declare const createKey: (prefix: string, key: string, namespace?: string) => string;
3
3
  interface SetToStorageConfig<V> extends Omit<GetFromStorageConfig<V>, 'fallback'> {
4
4
  value: V;
5
5
  }
6
+ interface UnsetFromStorageConfig extends Omit<GetFromStorageConfig<any>, 'fallback'> {
7
+ }
6
8
  interface GetFromStorageConfig<V> {
7
9
  /**
8
10
  * Ключ по которому можно получить значение из хранилища (имя ключа не полное, оно дополняется неймпспейсом проекта)
@@ -26,10 +28,12 @@ interface GetFromStorageConfig<V> {
26
28
  prefix?: string;
27
29
  }
28
30
  type SetToStorageWrappedConfig<V, BaseConfig extends StorageConfigBase> = Omit<SetToStorageConfig<V>, Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>> & Partial<Pick<SetToStorageConfig<V>, Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>>> & Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;
31
+ type UnsetFromStorageWrappedConfig<BaseConfig extends StorageConfigBase> = Omit<UnsetFromStorageConfig, Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>> & Partial<Pick<UnsetFromStorageConfig, Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>>> & Pick<BaseConfig, Exclude<keyof BaseConfig, keyof UnsetFromStorageConfig>>;
29
32
  type GetFromStorageWrappedConfig<V, BaseConfig extends StorageConfigBase> = Omit<GetFromStorageConfig<V>, Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>> & Partial<Pick<GetFromStorageConfig<V>, Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>>> & Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;
30
33
  type StorageConfigBase = Partial<Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>>;
31
34
  interface StorageApi<BaseConfig extends StorageConfigBase> {
32
35
  set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;
36
+ unset(config: UnsetFromStorageWrappedConfig<BaseConfig>): void;
33
37
  get<Value>(config: GetFromStorageWrappedConfig<Value, BaseConfig>): Value | null;
34
38
  }
35
39
  /**
@@ -37,5 +41,5 @@ interface StorageApi<BaseConfig extends StorageConfigBase> {
37
41
  */
38
42
  declare function createStorage<BaseConfig extends StorageConfigBase>(storageConfig: BaseConfig): StorageApi<BaseConfig>;
39
43
 
40
- export { createStorage, createStorageKey };
41
- export type { GetFromStorageConfig, GetFromStorageWrappedConfig, SetToStorageConfig, SetToStorageWrappedConfig, StorageApi, StorageConfigBase, StorageType };
44
+ export { createKey, createStorage };
45
+ export type { GetFromStorageConfig, GetFromStorageWrappedConfig, SetToStorageConfig, SetToStorageWrappedConfig, StorageApi, StorageConfigBase, StorageType, UnsetFromStorageConfig, UnsetFromStorageWrappedConfig };
package/storage.js CHANGED
@@ -2,7 +2,7 @@ const storages = {
2
2
  session: sessionStorage,
3
3
  local: localStorage
4
4
  };
5
- const createStorageKey = (prefix, key, namespace) => `${prefix}${namespace ? `/${namespace}` : ""}/${key}`;
5
+ const createKey = (prefix, key, namespace) => `${prefix}${namespace ? `/${namespace}` : ""}/${key}`;
6
6
  const parseStorageValue = (value) => {
7
7
  if (typeof value !== "string") {
8
8
  return value;
@@ -25,10 +25,19 @@ function createStorage(storageConfig) {
25
25
  const storagePrefix = config.prefix ?? storageConfig.prefix;
26
26
  const storage = storages[storageType];
27
27
  storage.setItem(
28
- createStorageKey(storagePrefix, config.key, config.namespace),
28
+ createKey(storagePrefix, config.key, config.namespace),
29
29
  formatValueToStorage(config.value)
30
30
  );
31
31
  },
32
+ unset: (cfg) => {
33
+ const config = cfg;
34
+ const storageType = config.type ?? storageConfig.type;
35
+ const storagePrefix = config.prefix ?? storageConfig.prefix;
36
+ const storage = storages[storageType];
37
+ storage.removeItem(
38
+ createKey(storagePrefix, config.key, config.namespace)
39
+ );
40
+ },
32
41
  get: (cfg) => {
33
42
  const config = cfg;
34
43
  const storageType = config.type ?? storageConfig.type;
@@ -36,14 +45,14 @@ function createStorage(storageConfig) {
36
45
  const storage = storages[storageType];
37
46
  return parseStorageValue(
38
47
  storage.getItem(
39
- createStorageKey(storagePrefix, config.key, config.namespace)
48
+ createKey(storagePrefix, config.key, config.namespace)
40
49
  )
41
50
  ) ?? config.fallback ?? null;
42
51
  }
43
52
  };
44
53
  }
45
54
  export {
46
- createStorage,
47
- createStorageKey
55
+ createKey,
56
+ createStorage
48
57
  };
49
58
  //# sourceMappingURL=storage.js.map
package/storage.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sources":["../src/storage.ts"],"sourcesContent":["export type StorageType = 'session' | 'local';\n\nconst storages: Record<StorageType, Storage> = {\n session: sessionStorage,\n local: localStorage,\n};\n\nexport const createStorageKey = (\n prefix: string,\n key: string,\n namespace?: string,\n) => `${prefix}${namespace ? `/${namespace}` : ''}/${key}`;\n\nconst parseStorageValue = <V>(value: unknown): V | null => {\n if (typeof value !== 'string') {\n return value as V;\n }\n\n try {\n const parsed = JSON.parse(value);\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst formatValueToStorage = (value: unknown): string => {\n return JSON.stringify(value);\n};\n\nexport interface SetToStorageConfig<V>\n extends Omit<GetFromStorageConfig<V>, 'fallback'> {\n value: V;\n}\n\nexport interface GetFromStorageConfig<V> {\n /**\n * Ключ по которому можно получить значение из хранилища (имя ключа не полное, оно дополняется неймпспейсом проекта)\n */\n key: string;\n /**\n * Тип хранилища\n */\n type: StorageType;\n /**\n * дефолтное значение, которое будет использоваться если значения нет в хранилище\n */\n fallback?: V;\n /**\n * Доп. делитель в ключ/utils/types'е\n */\n namespace?: string;\n /**\n * Доп. делитель\n */\n prefix?: string;\n}\n\nexport type SetToStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;\n\nexport type GetFromStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;\n\nexport type StorageConfigBase = Partial<\n Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>\n>;\n\nexport interface StorageApi<BaseConfig extends StorageConfigBase> {\n set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;\n get<Value>(\n config: GetFromStorageWrappedConfig<Value, BaseConfig>,\n ): Value | null;\n}\n\n/**\n * Создает интерфейс для работы с хранилищем (localStorage, sessionStorage)\n */\nexport function createStorage<BaseConfig extends StorageConfigBase>(\n storageConfig: BaseConfig,\n): StorageApi<BaseConfig> {\n return {\n set: <Value>(cfg: SetToStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n storage.setItem(\n createStorageKey(storagePrefix, config.key, config.namespace),\n formatValueToStorage(config.value),\n );\n },\n get: <Value>(cfg: GetFromStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as GetFromStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n return (\n parseStorageValue<Value>(\n storage.getItem(\n createStorageKey(storagePrefix, config.key, config.namespace),\n ),\n ) ??\n config.fallback ??\n null\n );\n },\n } as const;\n}\n"],"names":[],"mappings":"AAEA,MAAM,WAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,OAAO;AACT;AAEO,MAAM,mBAAmB,CAC9B,QACA,KACA,cACG,GAAG,MAAM,GAAG,YAAY,IAAI,SAAS,KAAK,EAAE,IAAI,GAAG;AAExD,MAAM,oBAAoB,CAAI,UAA6B;AACzD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAM,uBAAuB,CAAC,UAA2B;AACvD,SAAO,KAAK,UAAU,KAAK;AAC7B;AA0EO,SAAS,cACd,eACwB;AACxB,SAAO;AAAA,IACL,KAAK,CAAQ,QAAsD;AACjE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtD,YAAM,UAAU,SAAS,WAAW;AAEpC,cAAQ;AAAA,QACN,iBAAiB,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,QAC5D,qBAAqB,OAAO,KAAK;AAAA,MAAA;AAAA,IAErC;AAAA,IACA,KAAK,CAAQ,QAAwD;AACnE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtD,YAAM,UAAU,SAAS,WAAW;AAEpC,aACE;AAAA,QACE,QAAQ;AAAA,UACN,iBAAiB,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,QAAA;AAAA,MAC9D,KAEF,OAAO,YACP;AAAA,IAEJ;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"storage.js","sources":["../src/storage.ts"],"sourcesContent":["export type StorageType = 'session' | 'local';\n\nconst storages: Record<StorageType, Storage> = {\n session: sessionStorage,\n local: localStorage,\n};\n\nexport const createKey = (prefix: string, key: string, namespace?: string) =>\n `${prefix}${namespace ? `/${namespace}` : ''}/${key}`;\n\nconst parseStorageValue = <V>(value: unknown): V | null => {\n if (typeof value !== 'string') {\n return value as V;\n }\n\n try {\n const parsed = JSON.parse(value);\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst formatValueToStorage = (value: unknown): string => {\n return JSON.stringify(value);\n};\n\nexport interface SetToStorageConfig<V>\n extends Omit<GetFromStorageConfig<V>, 'fallback'> {\n value: V;\n}\n\nexport interface UnsetFromStorageConfig\n extends Omit<GetFromStorageConfig<any>, 'fallback'> {}\n\nexport interface GetFromStorageConfig<V> {\n /**\n * Ключ по которому можно получить значение из хранилища (имя ключа не полное, оно дополняется неймпспейсом проекта)\n */\n key: string;\n /**\n * Тип хранилища\n */\n type: StorageType;\n /**\n * дефолтное значение, которое будет использоваться если значения нет в хранилище\n */\n fallback?: V;\n /**\n * Доп. делитель в ключ/utils/types'е\n */\n namespace?: string;\n /**\n * Доп. делитель\n */\n prefix?: string;\n}\n\nexport type SetToStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;\n\nexport type UnsetFromStorageWrappedConfig<\n BaseConfig extends StorageConfigBase,\n> = Omit<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n> &\n Partial<\n Pick<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof UnsetFromStorageConfig>>;\n\nexport type GetFromStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;\n\nexport type StorageConfigBase = Partial<\n Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>\n>;\n\nexport interface StorageApi<BaseConfig extends StorageConfigBase> {\n set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;\n unset(config: UnsetFromStorageWrappedConfig<BaseConfig>): void;\n get<Value>(\n config: GetFromStorageWrappedConfig<Value, BaseConfig>,\n ): Value | null;\n}\n\n/**\n * Создает интерфейс для работы с хранилищем (localStorage, sessionStorage)\n */\nexport function createStorage<BaseConfig extends StorageConfigBase>(\n storageConfig: BaseConfig,\n): StorageApi<BaseConfig> {\n return {\n set: <Value>(cfg: SetToStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n storage.setItem(\n createKey(storagePrefix, config.key, config.namespace),\n formatValueToStorage(config.value),\n );\n },\n unset: <Value>(cfg: UnsetFromStorageWrappedConfig<BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n const storage = storages[storageType];\n\n storage.removeItem(\n createKey(storagePrefix, config.key, config.namespace),\n );\n },\n get: <Value>(cfg: GetFromStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as GetFromStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n return (\n parseStorageValue<Value>(\n storage.getItem(\n createKey(storagePrefix, config.key, config.namespace),\n ),\n ) ??\n config.fallback ??\n null\n );\n },\n } as const;\n}\n"],"names":[],"mappings":"AAEA,MAAM,WAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,OAAO;AACT;AAEO,MAAM,YAAY,CAAC,QAAgB,KAAa,cACrD,GAAG,MAAM,GAAG,YAAY,IAAI,SAAS,KAAK,EAAE,IAAI,GAAG;AAErD,MAAM,oBAAoB,CAAI,UAA6B;AACzD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAM,uBAAuB,CAAC,UAA2B;AACvD,SAAO,KAAK,UAAU,KAAK;AAC7B;AA4FO,SAAS,cACd,eACwB;AACxB,SAAO;AAAA,IACL,KAAK,CAAQ,QAAsD;AACjE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtD,YAAM,UAAU,SAAS,WAAW;AAEpC,cAAQ;AAAA,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,QACrD,qBAAqB,OAAO,KAAK;AAAA,MAAA;AAAA,IAErC;AAAA,IACA,OAAO,CAAQ,QAAmD;AAChE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AACtD,YAAM,UAAU,SAAS,WAAW;AAEpC,cAAQ;AAAA,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,MAAA;AAAA,IAEzD;AAAA,IACA,KAAK,CAAQ,QAAwD;AACnE,YAAM,SAAS;AACf,YAAM,cAAe,OAAO,QAAQ,cAAc;AAClD,YAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtD,YAAM,UAAU,SAAS,WAAW;AAEpC,aACE;AAAA,QACE,QAAQ;AAAA,UACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS;AAAA,QAAA;AAAA,MACvD,KAEF,OAAO,YACP;AAAA,IAEJ;AAAA,EAAA;AAEJ;"}
package/types.d.ts CHANGED
@@ -55,6 +55,10 @@ type AnyObject = Record<keyof any, any>;
55
55
  * @returns Record with no keys and no values
56
56
  */
57
57
  type EmptyObject = Record<keyof any, never>;
58
+ /**
59
+ * T or T[];
60
+ */
61
+ type MaybeArray<T> = T | T[];
58
62
  /**
59
63
  * Represents all primitive types in TypeScript.
60
64
  *
@@ -434,4 +438,4 @@ type AnyBoolean = boolean & {};
434
438
  */
435
439
  type UpperFirst<S extends string> = S extends `${infer F}${infer R}` ? `${Uppercase<F>}${R}` : S;
436
440
 
437
- export type { AllPropertiesOptional, AnyBoolean, AnyFunction, AnyNumber, AnyObject, AnyPrimitive, AnyString, BrowserNativeObject, Class, CopyObject, DeepPartial, Defined, EmptyObject, ExtractEnumKeys, ExtractEnumValues, ExtractObjects, FalsyValues, Fn, HasKey, HasSpecificKey, IfEquals, IndexKeys, IsAny, IsArray, IsEmptyArray, IsFunction, IsObject, IsObjectEmpty, IsPartial, IsUnknown, KeyOfByValue, LiteralUnion, Maybe, MaybeFalsy, MaybeFn, MaybePromise, MaybeValues, NonReadonly, NonUndefined, NotMaybe, NotNullable, Nullable, OmitByValue, OverrideKey, Params, PartialIf, PartialKeys, PickByValue, Primitive, ReadonlyKeys, RecordEntries, RenameKey, RequiredKeys, UnionToIntersection, Unpromise, UpperFirst, ValueOf, WithRequired, WritableKeys };
441
+ export type { AllPropertiesOptional, AnyBoolean, AnyFunction, AnyNumber, AnyObject, AnyPrimitive, AnyString, BrowserNativeObject, Class, CopyObject, DeepPartial, Defined, EmptyObject, ExtractEnumKeys, ExtractEnumValues, ExtractObjects, FalsyValues, Fn, HasKey, HasSpecificKey, IfEquals, IndexKeys, IsAny, IsArray, IsEmptyArray, IsFunction, IsObject, IsObjectEmpty, IsPartial, IsUnknown, KeyOfByValue, LiteralUnion, Maybe, MaybeArray, MaybeFalsy, MaybeFn, MaybePromise, MaybeValues, NonReadonly, NonUndefined, NotMaybe, NotNullable, Nullable, OmitByValue, OverrideKey, Params, PartialIf, PartialKeys, PickByValue, Primitive, ReadonlyKeys, RecordEntries, RenameKey, RequiredKeys, UnionToIntersection, Unpromise, UpperFirst, ValueOf, WithRequired, WritableKeys };
package/types.global.d.ts CHANGED
@@ -56,6 +56,10 @@ type AnyObject = Record<keyof any, any>;
56
56
  * @returns Record with no keys and no values
57
57
  */
58
58
  type EmptyObject = Record<keyof any, never>;
59
+ /**
60
+ * T or T[];
61
+ */
62
+ type MaybeArray<T> = T | T[];
59
63
  /**
60
64
  * Represents all primitive types in TypeScript.
61
65
  *