@choksheak/react-utils 0.2.8 → 0.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.
Files changed (55) hide show
  1. package/package.json +50 -2
  2. package/sharedQuery.cjs +119 -130
  3. package/sharedQuery.d.mts +14 -8
  4. package/sharedQuery.d.ts +12 -6
  5. package/sharedQuery.min.cjs +1 -1
  6. package/sharedQuery.min.cjs.map +1 -1
  7. package/sharedQuery.min.mjs +1 -1
  8. package/sharedQuery.min.mjs.map +1 -1
  9. package/sharedQuery.mjs +117 -129
  10. package/sharedState.cjs +69 -101
  11. package/sharedState.d.mts +7 -3
  12. package/sharedState.d.ts +5 -2
  13. package/sharedState.min.cjs +1 -1
  14. package/sharedState.min.cjs.map +1 -1
  15. package/sharedState.min.mjs +1 -1
  16. package/sharedState.min.mjs.map +1 -1
  17. package/sharedState.mjs +67 -100
  18. package/storage.cjs +90 -0
  19. package/storage.d.mts +19 -0
  20. package/storage.d.ts +16 -0
  21. package/storage.min.cjs +2 -0
  22. package/storage.min.cjs.map +1 -0
  23. package/storage.min.mjs +2 -0
  24. package/storage.min.mjs.map +1 -0
  25. package/storage.mjs +65 -0
  26. package/{utils/stringify.cjs → stringify.cjs} +1 -1
  27. package/stringify.min.cjs.map +1 -0
  28. package/stringify.min.mjs.map +1 -0
  29. package/{utils/stringify.mjs → stringify.mjs} +1 -1
  30. package/{utils/useDeepMemo.cjs → useDeepMemo.cjs} +1 -1
  31. package/useDeepMemo.d.mts +7 -0
  32. package/useDeepMemo.d.ts +5 -0
  33. package/useDeepMemo.min.cjs.map +1 -0
  34. package/useDeepMemo.min.mjs.map +1 -0
  35. package/{utils/useDeepMemo.mjs → useDeepMemo.mjs} +1 -1
  36. package/utils/storage.cjs +0 -162
  37. package/utils/storage.d.mts +0 -46
  38. package/utils/storage.d.ts +0 -44
  39. package/utils/storage.min.cjs +0 -2
  40. package/utils/storage.min.cjs.map +0 -1
  41. package/utils/storage.min.mjs +0 -2
  42. package/utils/storage.min.mjs.map +0 -1
  43. package/utils/storage.mjs +0 -134
  44. package/utils/stringify.min.cjs.map +0 -1
  45. package/utils/stringify.min.mjs.map +0 -1
  46. package/utils/useDeepMemo.d.mts +0 -4
  47. package/utils/useDeepMemo.d.ts +0 -2
  48. package/utils/useDeepMemo.min.cjs.map +0 -1
  49. package/utils/useDeepMemo.min.mjs.map +0 -1
  50. /package/{utils/stringify.d.mts → stringify.d.mts} +0 -0
  51. /package/{utils/stringify.d.ts → stringify.d.ts} +0 -0
  52. /package/{utils/stringify.min.cjs → stringify.min.cjs} +0 -0
  53. /package/{utils/stringify.min.mjs → stringify.min.mjs} +0 -0
  54. /package/{utils/useDeepMemo.min.cjs → useDeepMemo.min.cjs} +0 -0
  55. /package/{utils/useDeepMemo.min.mjs → useDeepMemo.min.mjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage.ts"],"sourcesContent":["import { kvStore } from \"@choksheak/ts-utils/kvStore\";\nimport { LocalStore } from \"@choksheak/ts-utils/localStore\";\nimport { StorageAdapter } from \"@choksheak/ts-utils/storageAdapter\";\n\n/** List of all available pre-built persistence options. */\nexport type PersistTo = \"localStorage\" | \"indexedDb\";\n\nexport type StoreOptions = {\n persistTo: PersistTo;\n\n // Storage key to act as a namespace to store the data.\n key: string;\n\n // How long to wait before the value is considered expired.\n expiryMs?: number;\n};\n\nexport type StorageOptions<T> = {\n /**\n * You can either specify the storage adapter directly to use a custom\n * store, or specify the properties to use the pre-built ones.\n */\n store?: StorageAdapter<T> | StoreOptions;\n};\n\nexport function getStorageAdapter<T>(\n options: StorageOptions<T> | undefined,\n defaultStoreExpiryMs: number,\n): StorageAdapter<T> | null {\n const { store } = options ?? {};\n\n if (!store) {\n return null;\n }\n\n if (\n \"persistTo\" in store &&\n typeof store.persistTo === \"string\" &&\n \"key\" in store &&\n typeof store.key === \"string\"\n ) {\n const expiryMs = store.expiryMs || defaultStoreExpiryMs;\n\n switch (store.persistTo) {\n case \"localStorage\": {\n const adapter = new LocalStore(store.key, {\n defaultExpiryMs: expiryMs,\n });\n\n // Handle SSR.\n return {\n set: (key: string, value: T): void => {\n if (typeof window === \"undefined\") return; // handle SSR\n\n // Also apply the custom expiryMs on every item in this store.\n adapter.set(key, value);\n },\n get: (key: string): T | undefined => {\n if (typeof window === \"undefined\") return undefined; // handle SSR\n\n return adapter.get(key);\n },\n delete: (key: string): void => {\n if (typeof window === \"undefined\") return; // handle SSR\n\n adapter.delete(key);\n },\n clear: (): void => {\n if (typeof window === \"undefined\") return; // handle SSR\n\n adapter.clear();\n },\n };\n }\n\n case \"indexedDb\": {\n // Use the key prefix as a unique namespace for this store.\n const keyPrefix = store.key + \":\";\n\n // Prefix all keys using `keyPrefix` so that we can keep all data in\n // the same store in the same DB. If we keep the data in different\n // DB stores, then GC will not be able to clean up abandoned stores.\n return {\n set: async (key: string, value: T): Promise<void> => {\n if (typeof window === \"undefined\") return; // handle SSR\n\n // Also apply the custom expiryMs on every item in this store.\n await kvStore.set(keyPrefix + key, value, expiryMs);\n },\n get: async (key: string): Promise<T | undefined> => {\n if (typeof window === \"undefined\") return undefined; // handle SSR\n\n return await kvStore.get(keyPrefix + key);\n },\n delete: async (key: string): Promise<void> => {\n if (typeof window === \"undefined\") return; // handle SSR\n\n await kvStore.delete(keyPrefix + key);\n },\n clear: async (): Promise<void> => {\n if (typeof window === \"undefined\") return; // handle SSR\n\n await kvStore.clear();\n },\n };\n }\n\n default:\n store.persistTo satisfies never;\n throw new Error(`Unknown store.adapter ${store.persistTo}`);\n }\n }\n\n return store as StorageAdapter<T>;\n}\n"],"mappings":"AAAA,OAAS,WAAAA,MAAe,8BACxB,OAAS,cAAAC,MAAkB,iCAwBpB,SAASC,EACdC,EACAC,EAC0B,CAC1B,GAAM,CAAE,MAAAC,CAAM,EAAIF,GAAW,CAAC,EAE9B,GAAI,CAACE,EACH,OAAO,KAGT,GACE,cAAeA,GACf,OAAOA,EAAM,WAAc,UAC3B,QAASA,GACT,OAAOA,EAAM,KAAQ,SACrB,CACA,IAAMC,EAAWD,EAAM,UAAYD,EAEnC,OAAQC,EAAM,UAAW,CACvB,IAAK,eAAgB,CACnB,IAAME,EAAU,IAAIN,EAAWI,EAAM,IAAK,CACxC,gBAAiBC,CACnB,CAAC,EAGD,MAAO,CACL,IAAK,CAACE,EAAaC,IAAmB,CAChC,OAAO,OAAW,KAGtBF,EAAQ,IAAIC,EAAKC,CAAK,CACxB,EACA,IAAMD,GAA+B,CACnC,GAAI,SAAO,OAAW,KAEtB,OAAOD,EAAQ,IAAIC,CAAG,CACxB,EACA,OAASA,GAAsB,CACzB,OAAO,OAAW,KAEtBD,EAAQ,OAAOC,CAAG,CACpB,EACA,MAAO,IAAY,CACb,OAAO,OAAW,KAEtBD,EAAQ,MAAM,CAChB,CACF,CACF,CAEA,IAAK,YAAa,CAEhB,IAAMG,EAAYL,EAAM,IAAM,IAK9B,MAAO,CACL,IAAK,MAAOG,EAAaC,IAA4B,CAC/C,OAAO,OAAW,KAGtB,MAAMT,EAAQ,IAAIU,EAAYF,EAAKC,EAAOH,CAAQ,CACpD,EACA,IAAK,MAAOE,GAAwC,CAClD,GAAI,SAAO,OAAW,KAEtB,OAAO,MAAMR,EAAQ,IAAIU,EAAYF,CAAG,CAC1C,EACA,OAAQ,MAAOA,GAA+B,CACxC,OAAO,OAAW,KAEtB,MAAMR,EAAQ,OAAOU,EAAYF,CAAG,CACtC,EACA,MAAO,SAA2B,CAC5B,OAAO,OAAW,KAEtB,MAAMR,EAAQ,MAAM,CACtB,CACF,CACF,CAEA,QACE,MAAAK,EAAM,UACA,IAAI,MAAM,yBAAyBA,EAAM,SAAS,EAAE,CAC9D,CACF,CAEA,OAAOA,CACT","names":["kvStore","LocalStore","getStorageAdapter","options","defaultStoreExpiryMs","store","expiryMs","adapter","key","value","keyPrefix"]}
package/storage.mjs ADDED
@@ -0,0 +1,65 @@
1
+ // src/storage.ts
2
+ import { kvStore } from "@choksheak/ts-utils/kvStore";
3
+ import { LocalStore } from "@choksheak/ts-utils/localStore";
4
+ function getStorageAdapter(options, defaultStoreExpiryMs) {
5
+ const { store } = options ?? {};
6
+ if (!store) {
7
+ return null;
8
+ }
9
+ if ("persistTo" in store && typeof store.persistTo === "string" && "key" in store && typeof store.key === "string") {
10
+ const expiryMs = store.expiryMs || defaultStoreExpiryMs;
11
+ switch (store.persistTo) {
12
+ case "localStorage": {
13
+ const adapter = new LocalStore(store.key, {
14
+ defaultExpiryMs: expiryMs
15
+ });
16
+ return {
17
+ set: (key, value) => {
18
+ if (typeof window === "undefined") return;
19
+ adapter.set(key, value);
20
+ },
21
+ get: (key) => {
22
+ if (typeof window === "undefined") return void 0;
23
+ return adapter.get(key);
24
+ },
25
+ delete: (key) => {
26
+ if (typeof window === "undefined") return;
27
+ adapter.delete(key);
28
+ },
29
+ clear: () => {
30
+ if (typeof window === "undefined") return;
31
+ adapter.clear();
32
+ }
33
+ };
34
+ }
35
+ case "indexedDb": {
36
+ const keyPrefix = store.key + ":";
37
+ return {
38
+ set: async (key, value) => {
39
+ if (typeof window === "undefined") return;
40
+ await kvStore.set(keyPrefix + key, value, expiryMs);
41
+ },
42
+ get: async (key) => {
43
+ if (typeof window === "undefined") return void 0;
44
+ return await kvStore.get(keyPrefix + key);
45
+ },
46
+ delete: async (key) => {
47
+ if (typeof window === "undefined") return;
48
+ await kvStore.delete(keyPrefix + key);
49
+ },
50
+ clear: async () => {
51
+ if (typeof window === "undefined") return;
52
+ await kvStore.clear();
53
+ }
54
+ };
55
+ }
56
+ default:
57
+ store.persistTo;
58
+ throw new Error(`Unknown store.adapter ${store.persistTo}`);
59
+ }
60
+ }
61
+ return store;
62
+ }
63
+ export {
64
+ getStorageAdapter
65
+ };
@@ -17,7 +17,7 @@ var __copyProps = (to, from, except, desc) => {
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
- // src/utils/stringify.ts
20
+ // src/stringify.ts
21
21
  var stringify_exports = {};
22
22
  __export(stringify_exports, {
23
23
  stringifyDeterministicForKeys: () => stringifyDeterministicForKeys
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stringify.ts"],"sourcesContent":["/**\n * JSON stringify a value of any type, and returns an unsafe string. The string\n * is \"unsafe\" because you might not be able to restore the original object\n * using the serialized JSON. This is specifically used for query key generation\n * and is not suitable for more general uses.\n *\n * Note: The given value should not contain any functions because functions\n * cannot be serialized and deserialized properly.\n */\nexport function stringifyDeterministicForKeys(params: unknown): string {\n const cache = new Set();\n\n return JSON.stringify(params, (_, value) => {\n if (typeof value === \"function\") {\n throw new Error(`Functions should not be passed into query parameters`);\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return value;\n }\n\n if (cache.has(value)) {\n // Circular reference detected! Return a placeholder string.\n return \"[Circular]\";\n }\n\n cache.add(value);\n\n // Don't crash on circular references, but don't mark the top level object\n // as circular because we want to return as much string as possible.\n if (value !== params) {\n try {\n JSON.stringify(value);\n } catch {\n return \"[Unserializable]\";\n }\n }\n\n return Object.keys(value)\n .sort()\n .reduce(\n (result: Record<string, unknown>, key: string) => {\n result[key] = value[key];\n return result;\n },\n {} as Record<string, unknown>,\n );\n });\n}\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,IAAA,eAAAC,EAAAH,GASO,SAASE,EAA8BE,EAAyB,CACrE,IAAMC,EAAQ,IAAI,IAElB,OAAO,KAAK,UAAUD,EAAQ,CAACE,EAAGC,IAAU,CAC1C,GAAI,OAAOA,GAAU,WACnB,MAAM,IAAI,MAAM,sDAAsD,EAGxE,GAAI,CAACA,GAAS,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EAC5D,OAAOA,EAGT,GAAIF,EAAM,IAAIE,CAAK,EAEjB,MAAO,aAOT,GAJAF,EAAM,IAAIE,CAAK,EAIXA,IAAUH,EACZ,GAAI,CACF,KAAK,UAAUG,CAAK,CACtB,MAAQ,CACN,MAAO,kBACT,CAGF,OAAO,OAAO,KAAKA,CAAK,EACrB,KAAK,EACL,OACC,CAACC,EAAiCC,KAChCD,EAAOC,CAAG,EAAIF,EAAME,CAAG,EAChBD,GAET,CAAC,CACH,CACJ,CAAC,CACH","names":["stringify_exports","__export","stringifyDeterministicForKeys","__toCommonJS","params","cache","_","value","result","key"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stringify.ts"],"sourcesContent":["/**\n * JSON stringify a value of any type, and returns an unsafe string. The string\n * is \"unsafe\" because you might not be able to restore the original object\n * using the serialized JSON. This is specifically used for query key generation\n * and is not suitable for more general uses.\n *\n * Note: The given value should not contain any functions because functions\n * cannot be serialized and deserialized properly.\n */\nexport function stringifyDeterministicForKeys(params: unknown): string {\n const cache = new Set();\n\n return JSON.stringify(params, (_, value) => {\n if (typeof value === \"function\") {\n throw new Error(`Functions should not be passed into query parameters`);\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return value;\n }\n\n if (cache.has(value)) {\n // Circular reference detected! Return a placeholder string.\n return \"[Circular]\";\n }\n\n cache.add(value);\n\n // Don't crash on circular references, but don't mark the top level object\n // as circular because we want to return as much string as possible.\n if (value !== params) {\n try {\n JSON.stringify(value);\n } catch {\n return \"[Unserializable]\";\n }\n }\n\n return Object.keys(value)\n .sort()\n .reduce(\n (result: Record<string, unknown>, key: string) => {\n result[key] = value[key];\n return result;\n },\n {} as Record<string, unknown>,\n );\n });\n}\n"],"mappings":"AASO,SAASA,EAA8BC,EAAyB,CACrE,IAAMC,EAAQ,IAAI,IAElB,OAAO,KAAK,UAAUD,EAAQ,CAACE,EAAGC,IAAU,CAC1C,GAAI,OAAOA,GAAU,WACnB,MAAM,IAAI,MAAM,sDAAsD,EAGxE,GAAI,CAACA,GAAS,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EAC5D,OAAOA,EAGT,GAAIF,EAAM,IAAIE,CAAK,EAEjB,MAAO,aAOT,GAJAF,EAAM,IAAIE,CAAK,EAIXA,IAAUH,EACZ,GAAI,CACF,KAAK,UAAUG,CAAK,CACtB,MAAQ,CACN,MAAO,kBACT,CAGF,OAAO,OAAO,KAAKA,CAAK,EACrB,KAAK,EACL,OACC,CAACC,EAAiCC,KAChCD,EAAOC,CAAG,EAAIF,EAAME,CAAG,EAChBD,GAET,CAAC,CACH,CACJ,CAAC,CACH","names":["stringifyDeterministicForKeys","params","cache","_","value","result","key"]}
@@ -1,4 +1,4 @@
1
- // src/utils/stringify.ts
1
+ // src/stringify.ts
2
2
  function stringifyDeterministicForKeys(params) {
3
3
  const cache = /* @__PURE__ */ new Set();
4
4
  return JSON.stringify(params, (_, value) => {
@@ -27,7 +27,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
- // src/utils/useDeepMemo.ts
30
+ // src/useDeepMemo.ts
31
31
  var useDeepMemo_exports = {};
32
32
  __export(useDeepMemo_exports, {
33
33
  useDeepMemo: () => useDeepMemo
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Provides a stable value for T based on deep equality. The deep equality is
3
+ * determined by the `isEqual()` function in lodash.
4
+ */
5
+ declare function useDeepMemo<T>(value: T): T;
6
+
7
+ export { useDeepMemo };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Provides a stable value for T based on deep equality. The deep equality is
3
+ * determined by the `isEqual()` function in lodash.
4
+ */
5
+ export declare function useDeepMemo<T>(value: T): T;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/useDeepMemo.ts"],"sourcesContent":["import isEqual from \"lodash/isEqual\";\nimport { useMemo, useState } from \"react\";\n\n/**\n * Provides a stable value for T based on deep equality. The deep equality is\n * determined by the `isEqual()` function in lodash.\n */\nexport function useDeepMemo<T>(value: T): T {\n const [state, setState] = useState<T>(value);\n\n return useMemo(() => {\n if (state === value || isEqual(state, value)) {\n return state;\n }\n\n // We check equality, so this should be safe.\n // eslint-disable-next-line react-hooks/set-state-in-render\n setState(value);\n\n return value;\n }, [state, value]);\n}\n"],"mappings":"0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAoB,6BACpBC,EAAkC,iBAM3B,SAASH,EAAeI,EAAa,CAC1C,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAAYF,CAAK,EAE3C,SAAO,WAAQ,IACTC,IAAUD,MAAS,EAAAG,SAAQF,EAAOD,CAAK,EAClCC,GAKTC,EAASF,CAAK,EAEPA,GACN,CAACC,EAAOD,CAAK,CAAC,CACnB","names":["useDeepMemo_exports","__export","useDeepMemo","__toCommonJS","import_isEqual","import_react","value","state","setState","isEqual"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/useDeepMemo.ts"],"sourcesContent":["import isEqual from \"lodash/isEqual\";\nimport { useMemo, useState } from \"react\";\n\n/**\n * Provides a stable value for T based on deep equality. The deep equality is\n * determined by the `isEqual()` function in lodash.\n */\nexport function useDeepMemo<T>(value: T): T {\n const [state, setState] = useState<T>(value);\n\n return useMemo(() => {\n if (state === value || isEqual(state, value)) {\n return state;\n }\n\n // We check equality, so this should be safe.\n // eslint-disable-next-line react-hooks/set-state-in-render\n setState(value);\n\n return value;\n }, [state, value]);\n}\n"],"mappings":"AAAA,OAAOA,MAAa,iBACpB,OAAS,WAAAC,EAAS,YAAAC,MAAgB,QAM3B,SAASC,EAAeC,EAAa,CAC1C,GAAM,CAACC,EAAOC,CAAQ,EAAIJ,EAAYE,CAAK,EAE3C,OAAOH,EAAQ,IACTI,IAAUD,GAASJ,EAAQK,EAAOD,CAAK,EAClCC,GAKTC,EAASF,CAAK,EAEPA,GACN,CAACC,EAAOD,CAAK,CAAC,CACnB","names":["isEqual","useMemo","useState","useDeepMemo","value","state","setState"]}
@@ -1,4 +1,4 @@
1
- // src/utils/useDeepMemo.ts
1
+ // src/useDeepMemo.ts
2
2
  import isEqual from "lodash/isEqual";
3
3
  import { useMemo, useState } from "react";
4
4
  function useDeepMemo(value) {
package/utils/storage.cjs DELETED
@@ -1,162 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/utils/storage.ts
21
- var storage_exports = {};
22
- __export(storage_exports, {
23
- InMemoryStorageAdapter: () => InMemoryStorageAdapter,
24
- IndexedDbAdapter: () => IndexedDbAdapter,
25
- LocalStorageAdapter: () => LocalStorageAdapter,
26
- getStorageAdapter: () => getStorageAdapter
27
- });
28
- module.exports = __toCommonJS(storage_exports);
29
- var import_kvStore = require("@choksheak/ts-utils/kvStore");
30
- function getStorageAdapter(options, defaultStoreExpiryMs) {
31
- const { localStorageKey, indexedDbKey, storeExpiryMs, store } = options ?? {};
32
- if (store) {
33
- return store;
34
- }
35
- const expiryMs = storeExpiryMs || defaultStoreExpiryMs;
36
- if (localStorageKey) {
37
- return new LocalStorageAdapter(localStorageKey, expiryMs);
38
- }
39
- if (indexedDbKey) {
40
- return new IndexedDbAdapter(indexedDbKey, expiryMs);
41
- }
42
- return null;
43
- }
44
- var InMemoryStorageAdapter = class {
45
- constructor(keyPrefix, expiryMs) {
46
- this.keyPrefix = keyPrefix;
47
- this.expiryMs = expiryMs;
48
- }
49
- cache = /* @__PURE__ */ new Map();
50
- save(key, value) {
51
- const fullKey = this.keyPrefix + ":" + key;
52
- this.cache.set(fullKey, {
53
- value,
54
- expiresAt: Date.now() + this.expiryMs
55
- });
56
- }
57
- load(key) {
58
- const fullKey = this.keyPrefix + ":" + key;
59
- const cached = this.cache.get(fullKey);
60
- if (cached && Date.now() < cached.expiresAt) {
61
- return cached.value;
62
- }
63
- return void 0;
64
- }
65
- delete(key) {
66
- const fullKey = this.keyPrefix + ":" + key;
67
- this.cache.delete(fullKey);
68
- }
69
- clear() {
70
- this.cache.clear();
71
- }
72
- };
73
- var LocalStorageAdapter = class {
74
- constructor(keyPrefix, expiryMs) {
75
- this.keyPrefix = keyPrefix;
76
- this.expiryMs = expiryMs;
77
- }
78
- save(key, value) {
79
- if (typeof window === "undefined") return;
80
- const fullKey = this.keyPrefix + ":" + key;
81
- window.localStorage.setItem(
82
- fullKey,
83
- JSON.stringify({
84
- value,
85
- expiresAt: this.expiryMs ? Date.now() + this.expiryMs : 0
86
- })
87
- );
88
- }
89
- load(key) {
90
- if (typeof window === "undefined") return void 0;
91
- const fullKey = this.keyPrefix + ":" + key;
92
- const raw = window.localStorage.getItem(fullKey);
93
- if (!raw) return void 0;
94
- try {
95
- const box = JSON.parse(raw);
96
- if (!box || box.expiresAt && Date.now() >= box.expiresAt) {
97
- window.localStorage.removeItem(fullKey);
98
- return void 0;
99
- }
100
- return box.value;
101
- } catch {
102
- window.localStorage.removeItem(fullKey);
103
- return void 0;
104
- }
105
- }
106
- delete(key) {
107
- if (typeof window === "undefined") return;
108
- const fullKey = this.keyPrefix + ":" + key;
109
- window.localStorage.removeItem(fullKey);
110
- }
111
- clear() {
112
- if (typeof window === "undefined") return;
113
- for (const key of Object.keys(window.localStorage)) {
114
- if (key.startsWith(this.keyPrefix)) {
115
- window.localStorage.removeItem(key);
116
- }
117
- }
118
- }
119
- };
120
- var IndexedDbAdapter = class {
121
- constructor(keyPrefix, expiryMs) {
122
- this.keyPrefix = keyPrefix;
123
- this.expiryMs = expiryMs;
124
- }
125
- async save(key, value) {
126
- if (typeof window === "undefined") return;
127
- const fullKey = this.keyPrefix + ":" + key;
128
- await import_kvStore.kvStore.set(fullKey, JSON.stringify(value), this.expiryMs);
129
- }
130
- async load(key) {
131
- if (typeof window === "undefined") return void 0;
132
- const fullKey = this.keyPrefix + ":" + key;
133
- const raw = await import_kvStore.kvStore.get(fullKey);
134
- if (raw === void 0) return void 0;
135
- try {
136
- return JSON.parse(raw);
137
- } catch {
138
- await import_kvStore.kvStore.delete(fullKey);
139
- return void 0;
140
- }
141
- }
142
- async delete(key) {
143
- if (typeof window === "undefined") return;
144
- const fullKey = this.keyPrefix + ":" + key;
145
- await import_kvStore.kvStore.delete(fullKey);
146
- }
147
- async clear() {
148
- if (typeof window === "undefined") return;
149
- await import_kvStore.kvStore.forEach(async (k) => {
150
- if (k.startsWith(this.keyPrefix)) {
151
- await import_kvStore.kvStore.delete(k);
152
- }
153
- });
154
- }
155
- };
156
- // Annotate the CommonJS export names for ESM import in node:
157
- 0 && (module.exports = {
158
- InMemoryStorageAdapter,
159
- IndexedDbAdapter,
160
- LocalStorageAdapter,
161
- getStorageAdapter
162
- });
@@ -1,46 +0,0 @@
1
- type StorageAdapter<T> = {
2
- save: (key: string, value: T) => Promise<void> | void;
3
- load: (key: string) => Promise<T | undefined> | T | undefined;
4
- delete: (key: string) => Promise<void> | void;
5
- clear: () => Promise<void> | void;
6
- };
7
- type StorageOptions<T> = {
8
- store?: StorageAdapter<T>;
9
- localStorageKey?: string;
10
- indexedDbKey?: string;
11
- storeExpiryMs?: number;
12
- };
13
- declare function getStorageAdapter<T>(options: StorageOptions<T> | undefined, defaultStoreExpiryMs: number): StorageAdapter<T> | null;
14
- /** Save state to memory only - not persisted. */
15
- declare class InMemoryStorageAdapter<T> implements StorageAdapter<T> {
16
- readonly keyPrefix: string;
17
- readonly expiryMs: number;
18
- private readonly cache;
19
- constructor(keyPrefix: string, expiryMs: number);
20
- save(key: string, value: T): void;
21
- load(key: string): T | undefined;
22
- delete(key: string): void;
23
- clear(): void;
24
- }
25
- /** Save state to local storage. */
26
- declare class LocalStorageAdapter<T> implements StorageAdapter<T> {
27
- readonly keyPrefix: string;
28
- readonly expiryMs: number;
29
- constructor(keyPrefix: string, expiryMs: number);
30
- save(key: string, value: T): void;
31
- load(key: string): T | undefined;
32
- delete(key: string): void;
33
- clear(): void;
34
- }
35
- /** Save state to indexed db. */
36
- declare class IndexedDbAdapter<T> implements StorageAdapter<T> {
37
- readonly keyPrefix: string;
38
- readonly expiryMs: number;
39
- constructor(keyPrefix: string, expiryMs: number);
40
- save(key: string, value: T): Promise<void>;
41
- load(key: string): Promise<T | undefined>;
42
- delete(key: string): Promise<void>;
43
- clear(): Promise<void>;
44
- }
45
-
46
- export { InMemoryStorageAdapter, IndexedDbAdapter, LocalStorageAdapter, type StorageAdapter, type StorageOptions, getStorageAdapter };
@@ -1,44 +0,0 @@
1
- export type StorageAdapter<T> = {
2
- save: (key: string, value: T) => Promise<void> | void;
3
- load: (key: string) => Promise<T | undefined> | T | undefined;
4
- delete: (key: string) => Promise<void> | void;
5
- clear: () => Promise<void> | void;
6
- };
7
- export type StorageOptions<T> = {
8
- store?: StorageAdapter<T>;
9
- localStorageKey?: string;
10
- indexedDbKey?: string;
11
- storeExpiryMs?: number;
12
- };
13
- export declare function getStorageAdapter<T>(options: StorageOptions<T> | undefined, defaultStoreExpiryMs: number): StorageAdapter<T> | null;
14
- /** Save state to memory only - not persisted. */
15
- export declare class InMemoryStorageAdapter<T> implements StorageAdapter<T> {
16
- readonly keyPrefix: string;
17
- readonly expiryMs: number;
18
- private readonly cache;
19
- constructor(keyPrefix: string, expiryMs: number);
20
- save(key: string, value: T): void;
21
- load(key: string): T | undefined;
22
- delete(key: string): void;
23
- clear(): void;
24
- }
25
- /** Save state to local storage. */
26
- export declare class LocalStorageAdapter<T> implements StorageAdapter<T> {
27
- readonly keyPrefix: string;
28
- readonly expiryMs: number;
29
- constructor(keyPrefix: string, expiryMs: number);
30
- save(key: string, value: T): void;
31
- load(key: string): T | undefined;
32
- delete(key: string): void;
33
- clear(): void;
34
- }
35
- /** Save state to indexed db. */
36
- export declare class IndexedDbAdapter<T> implements StorageAdapter<T> {
37
- readonly keyPrefix: string;
38
- readonly expiryMs: number;
39
- constructor(keyPrefix: string, expiryMs: number);
40
- save(key: string, value: T): Promise<void>;
41
- load(key: string): Promise<T | undefined>;
42
- delete(key: string): Promise<void>;
43
- clear(): Promise<void>;
44
- }
@@ -1,2 +0,0 @@
1
- "use strict";var d=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var w=(r,e)=>{for(var i in e)d(r,i,{get:e[i],enumerable:!0})},x=(r,e,i,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of p(e))!y.call(r,n)&&n!==i&&d(r,n,{get:()=>e[n],enumerable:!(t=f(e,n))||t.enumerable});return r};var g=r=>x(d({},"__esModule",{value:!0}),r);var m={};w(m,{InMemoryStorageAdapter:()=>l,IndexedDbAdapter:()=>a,LocalStorageAdapter:()=>s,getStorageAdapter:()=>h});module.exports=g(m);var o=require("@choksheak/ts-utils/kvStore");function h(r,e){let{localStorageKey:i,indexedDbKey:t,storeExpiryMs:n,store:u}=r??{};if(u)return u;let c=n||e;return i?new s(i,c):t?new a(t,c):null}var l=class{constructor(e,i){this.keyPrefix=e;this.expiryMs=i}cache=new Map;save(e,i){let t=this.keyPrefix+":"+e;this.cache.set(t,{value:i,expiresAt:Date.now()+this.expiryMs})}load(e){let i=this.keyPrefix+":"+e,t=this.cache.get(i);if(t&&Date.now()<t.expiresAt)return t.value}delete(e){let i=this.keyPrefix+":"+e;this.cache.delete(i)}clear(){this.cache.clear()}},s=class{constructor(e,i){this.keyPrefix=e;this.expiryMs=i}save(e,i){if(typeof window>"u")return;let t=this.keyPrefix+":"+e;window.localStorage.setItem(t,JSON.stringify({value:i,expiresAt:this.expiryMs?Date.now()+this.expiryMs:0}))}load(e){if(typeof window>"u")return;let i=this.keyPrefix+":"+e,t=window.localStorage.getItem(i);if(t)try{let n=JSON.parse(t);if(!n||n.expiresAt&&Date.now()>=n.expiresAt){window.localStorage.removeItem(i);return}return n.value}catch{window.localStorage.removeItem(i);return}}delete(e){if(typeof window>"u")return;let i=this.keyPrefix+":"+e;window.localStorage.removeItem(i)}clear(){if(!(typeof window>"u"))for(let e of Object.keys(window.localStorage))e.startsWith(this.keyPrefix)&&window.localStorage.removeItem(e)}},a=class{constructor(e,i){this.keyPrefix=e;this.expiryMs=i}async save(e,i){if(typeof window>"u")return;let t=this.keyPrefix+":"+e;await o.kvStore.set(t,JSON.stringify(i),this.expiryMs)}async load(e){if(typeof window>"u")return;let i=this.keyPrefix+":"+e,t=await o.kvStore.get(i);if(t!==void 0)try{return JSON.parse(t)}catch{await o.kvStore.delete(i);return}}async delete(e){if(typeof window>"u")return;let i=this.keyPrefix+":"+e;await o.kvStore.delete(i)}async clear(){typeof window>"u"||await o.kvStore.forEach(async e=>{e.startsWith(this.keyPrefix)&&await o.kvStore.delete(e)})}};0&&(module.exports={InMemoryStorageAdapter,IndexedDbAdapter,LocalStorageAdapter,getStorageAdapter});
2
- //# sourceMappingURL=storage.min.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/storage.ts"],"sourcesContent":["import { kvStore } from \"@choksheak/ts-utils/kvStore\";\n\nexport type StorageAdapter<T> = {\n save: (key: string, value: T) => Promise<void> | void;\n load: (key: string) => Promise<T | undefined> | T | undefined;\n delete: (key: string) => Promise<void> | void;\n clear: () => Promise<void> | void;\n};\n\nexport type StorageOptions<T> = {\n // If specified, this will be used and all other fields will be ignored.\n store?: StorageAdapter<T>;\n\n // Storage key in local storage for this data.\n localStorageKey?: string;\n\n // Storage key in indexed db for this data.\n indexedDbKey?: string;\n\n // How long to wait before the value is considered expired.\n storeExpiryMs?: number;\n};\n\nexport function getStorageAdapter<T>(\n options: StorageOptions<T> | undefined,\n defaultStoreExpiryMs: number,\n): StorageAdapter<T> | null {\n const { localStorageKey, indexedDbKey, storeExpiryMs, store } = options ?? {};\n\n if (store) {\n return store;\n }\n\n const expiryMs = storeExpiryMs || defaultStoreExpiryMs;\n\n if (localStorageKey) {\n return new LocalStorageAdapter<T>(localStorageKey, expiryMs);\n }\n\n if (indexedDbKey) {\n return new IndexedDbAdapter<T>(indexedDbKey, expiryMs);\n }\n\n return null;\n}\n\n/************************************************************************/\n/* Storage adapters */\n/************************************************************************/\n\ntype ValueWithExpiration<T> = { value: T; expiresAt: number };\n\n/** Save state to memory only - not persisted. */\nexport class InMemoryStorageAdapter<T> implements StorageAdapter<T> {\n private readonly cache = new Map<string, ValueWithExpiration<T>>();\n\n public constructor(\n public readonly keyPrefix: string,\n public readonly expiryMs: number,\n ) {}\n\n public save(key: string, value: T): void {\n const fullKey = this.keyPrefix + \":\" + key;\n this.cache.set(fullKey, {\n value,\n expiresAt: Date.now() + this.expiryMs,\n });\n }\n\n public load(key: string): T | undefined {\n const fullKey = this.keyPrefix + \":\" + key;\n const cached = this.cache.get(fullKey);\n\n if (cached && Date.now() < cached.expiresAt) {\n return cached.value;\n }\n\n return undefined;\n }\n\n public delete(key: string): void {\n const fullKey = this.keyPrefix + \":\" + key;\n this.cache.delete(fullKey);\n }\n\n public clear(): void {\n this.cache.clear();\n }\n}\n\n/** Save state to local storage. */\nexport class LocalStorageAdapter<T> implements StorageAdapter<T> {\n public constructor(\n public readonly keyPrefix: string,\n public readonly expiryMs: number,\n ) {}\n\n public save(key: string, value: T): void {\n if (typeof window === \"undefined\") return;\n\n const fullKey = this.keyPrefix + \":\" + key;\n window.localStorage.setItem(\n fullKey,\n JSON.stringify({\n value,\n expiresAt: this.expiryMs ? Date.now() + this.expiryMs : 0,\n } satisfies ValueWithExpiration<T>),\n );\n }\n\n public load(key: string): T | undefined {\n if (typeof window === \"undefined\") return undefined;\n\n const fullKey = this.keyPrefix + \":\" + key;\n const raw = window.localStorage.getItem(fullKey);\n if (!raw) return undefined;\n\n try {\n const box = JSON.parse(raw) as ValueWithExpiration<T>;\n if (!box || (box.expiresAt && Date.now() >= box.expiresAt)) {\n window.localStorage.removeItem(fullKey);\n return undefined;\n }\n\n return box.value;\n } catch {\n // Ignore error.\n window.localStorage.removeItem(fullKey);\n return undefined;\n }\n }\n\n public delete(key: string): void {\n if (typeof window === \"undefined\") return;\n\n const fullKey = this.keyPrefix + \":\" + key;\n window.localStorage.removeItem(fullKey);\n }\n\n public clear(): void {\n if (typeof window === \"undefined\") return;\n\n for (const key of Object.keys(window.localStorage)) {\n if (key.startsWith(this.keyPrefix)) {\n window.localStorage.removeItem(key);\n }\n }\n }\n}\n\n/** Save state to indexed db. */\nexport class IndexedDbAdapter<T> implements StorageAdapter<T> {\n public constructor(\n public readonly keyPrefix: string,\n public readonly expiryMs: number,\n ) {}\n\n public async save(key: string, value: T): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n const fullKey = this.keyPrefix + \":\" + key;\n await kvStore.set(fullKey, JSON.stringify(value), this.expiryMs);\n }\n\n public async load(key: string): Promise<T | undefined> {\n if (typeof window === \"undefined\") return undefined;\n\n const fullKey = this.keyPrefix + \":\" + key;\n const raw = await kvStore.get<string>(fullKey);\n if (raw === undefined) return undefined;\n\n try {\n return JSON.parse(raw);\n } catch {\n // Ignore error.\n await kvStore.delete(fullKey);\n return undefined;\n }\n }\n\n public async delete(key: string): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n const fullKey = this.keyPrefix + \":\" + key;\n await kvStore.delete(fullKey);\n }\n\n public async clear(): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n await kvStore.forEach(async (k) => {\n if (k.startsWith(this.keyPrefix)) {\n await kvStore.delete(k);\n }\n });\n }\n}\n"],"mappings":"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","names":["storage_exports","__export","InMemoryStorageAdapter","IndexedDbAdapter","LocalStorageAdapter","getStorageAdapter","__toCommonJS","import_kvStore","options","defaultStoreExpiryMs","localStorageKey","indexedDbKey","storeExpiryMs","store","expiryMs","keyPrefix","key","value","fullKey","cached","raw","box","k"]}
@@ -1,2 +0,0 @@
1
- import{kvStore as n}from"@choksheak/ts-utils/kvStore";function f(o,e){let{localStorageKey:i,indexedDbKey:t,storeExpiryMs:r,store:d}=o??{};if(d)return d;let l=r||e;return i?new s(i,l):t?new a(t,l):null}var u=class{constructor(e,i){this.keyPrefix=e;this.expiryMs=i}cache=new Map;save(e,i){let t=this.keyPrefix+":"+e;this.cache.set(t,{value:i,expiresAt:Date.now()+this.expiryMs})}load(e){let i=this.keyPrefix+":"+e,t=this.cache.get(i);if(t&&Date.now()<t.expiresAt)return t.value}delete(e){let i=this.keyPrefix+":"+e;this.cache.delete(i)}clear(){this.cache.clear()}},s=class{constructor(e,i){this.keyPrefix=e;this.expiryMs=i}save(e,i){if(typeof window>"u")return;let t=this.keyPrefix+":"+e;window.localStorage.setItem(t,JSON.stringify({value:i,expiresAt:this.expiryMs?Date.now()+this.expiryMs:0}))}load(e){if(typeof window>"u")return;let i=this.keyPrefix+":"+e,t=window.localStorage.getItem(i);if(t)try{let r=JSON.parse(t);if(!r||r.expiresAt&&Date.now()>=r.expiresAt){window.localStorage.removeItem(i);return}return r.value}catch{window.localStorage.removeItem(i);return}}delete(e){if(typeof window>"u")return;let i=this.keyPrefix+":"+e;window.localStorage.removeItem(i)}clear(){if(!(typeof window>"u"))for(let e of Object.keys(window.localStorage))e.startsWith(this.keyPrefix)&&window.localStorage.removeItem(e)}},a=class{constructor(e,i){this.keyPrefix=e;this.expiryMs=i}async save(e,i){if(typeof window>"u")return;let t=this.keyPrefix+":"+e;await n.set(t,JSON.stringify(i),this.expiryMs)}async load(e){if(typeof window>"u")return;let i=this.keyPrefix+":"+e,t=await n.get(i);if(t!==void 0)try{return JSON.parse(t)}catch{await n.delete(i);return}}async delete(e){if(typeof window>"u")return;let i=this.keyPrefix+":"+e;await n.delete(i)}async clear(){typeof window>"u"||await n.forEach(async e=>{e.startsWith(this.keyPrefix)&&await n.delete(e)})}};export{u as InMemoryStorageAdapter,a as IndexedDbAdapter,s as LocalStorageAdapter,f as getStorageAdapter};
2
- //# sourceMappingURL=storage.min.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/storage.ts"],"sourcesContent":["import { kvStore } from \"@choksheak/ts-utils/kvStore\";\n\nexport type StorageAdapter<T> = {\n save: (key: string, value: T) => Promise<void> | void;\n load: (key: string) => Promise<T | undefined> | T | undefined;\n delete: (key: string) => Promise<void> | void;\n clear: () => Promise<void> | void;\n};\n\nexport type StorageOptions<T> = {\n // If specified, this will be used and all other fields will be ignored.\n store?: StorageAdapter<T>;\n\n // Storage key in local storage for this data.\n localStorageKey?: string;\n\n // Storage key in indexed db for this data.\n indexedDbKey?: string;\n\n // How long to wait before the value is considered expired.\n storeExpiryMs?: number;\n};\n\nexport function getStorageAdapter<T>(\n options: StorageOptions<T> | undefined,\n defaultStoreExpiryMs: number,\n): StorageAdapter<T> | null {\n const { localStorageKey, indexedDbKey, storeExpiryMs, store } = options ?? {};\n\n if (store) {\n return store;\n }\n\n const expiryMs = storeExpiryMs || defaultStoreExpiryMs;\n\n if (localStorageKey) {\n return new LocalStorageAdapter<T>(localStorageKey, expiryMs);\n }\n\n if (indexedDbKey) {\n return new IndexedDbAdapter<T>(indexedDbKey, expiryMs);\n }\n\n return null;\n}\n\n/************************************************************************/\n/* Storage adapters */\n/************************************************************************/\n\ntype ValueWithExpiration<T> = { value: T; expiresAt: number };\n\n/** Save state to memory only - not persisted. */\nexport class InMemoryStorageAdapter<T> implements StorageAdapter<T> {\n private readonly cache = new Map<string, ValueWithExpiration<T>>();\n\n public constructor(\n public readonly keyPrefix: string,\n public readonly expiryMs: number,\n ) {}\n\n public save(key: string, value: T): void {\n const fullKey = this.keyPrefix + \":\" + key;\n this.cache.set(fullKey, {\n value,\n expiresAt: Date.now() + this.expiryMs,\n });\n }\n\n public load(key: string): T | undefined {\n const fullKey = this.keyPrefix + \":\" + key;\n const cached = this.cache.get(fullKey);\n\n if (cached && Date.now() < cached.expiresAt) {\n return cached.value;\n }\n\n return undefined;\n }\n\n public delete(key: string): void {\n const fullKey = this.keyPrefix + \":\" + key;\n this.cache.delete(fullKey);\n }\n\n public clear(): void {\n this.cache.clear();\n }\n}\n\n/** Save state to local storage. */\nexport class LocalStorageAdapter<T> implements StorageAdapter<T> {\n public constructor(\n public readonly keyPrefix: string,\n public readonly expiryMs: number,\n ) {}\n\n public save(key: string, value: T): void {\n if (typeof window === \"undefined\") return;\n\n const fullKey = this.keyPrefix + \":\" + key;\n window.localStorage.setItem(\n fullKey,\n JSON.stringify({\n value,\n expiresAt: this.expiryMs ? Date.now() + this.expiryMs : 0,\n } satisfies ValueWithExpiration<T>),\n );\n }\n\n public load(key: string): T | undefined {\n if (typeof window === \"undefined\") return undefined;\n\n const fullKey = this.keyPrefix + \":\" + key;\n const raw = window.localStorage.getItem(fullKey);\n if (!raw) return undefined;\n\n try {\n const box = JSON.parse(raw) as ValueWithExpiration<T>;\n if (!box || (box.expiresAt && Date.now() >= box.expiresAt)) {\n window.localStorage.removeItem(fullKey);\n return undefined;\n }\n\n return box.value;\n } catch {\n // Ignore error.\n window.localStorage.removeItem(fullKey);\n return undefined;\n }\n }\n\n public delete(key: string): void {\n if (typeof window === \"undefined\") return;\n\n const fullKey = this.keyPrefix + \":\" + key;\n window.localStorage.removeItem(fullKey);\n }\n\n public clear(): void {\n if (typeof window === \"undefined\") return;\n\n for (const key of Object.keys(window.localStorage)) {\n if (key.startsWith(this.keyPrefix)) {\n window.localStorage.removeItem(key);\n }\n }\n }\n}\n\n/** Save state to indexed db. */\nexport class IndexedDbAdapter<T> implements StorageAdapter<T> {\n public constructor(\n public readonly keyPrefix: string,\n public readonly expiryMs: number,\n ) {}\n\n public async save(key: string, value: T): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n const fullKey = this.keyPrefix + \":\" + key;\n await kvStore.set(fullKey, JSON.stringify(value), this.expiryMs);\n }\n\n public async load(key: string): Promise<T | undefined> {\n if (typeof window === \"undefined\") return undefined;\n\n const fullKey = this.keyPrefix + \":\" + key;\n const raw = await kvStore.get<string>(fullKey);\n if (raw === undefined) return undefined;\n\n try {\n return JSON.parse(raw);\n } catch {\n // Ignore error.\n await kvStore.delete(fullKey);\n return undefined;\n }\n }\n\n public async delete(key: string): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n const fullKey = this.keyPrefix + \":\" + key;\n await kvStore.delete(fullKey);\n }\n\n public async clear(): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n await kvStore.forEach(async (k) => {\n if (k.startsWith(this.keyPrefix)) {\n await kvStore.delete(k);\n }\n });\n }\n}\n"],"mappings":"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","names":["kvStore","getStorageAdapter","options","defaultStoreExpiryMs","localStorageKey","indexedDbKey","storeExpiryMs","store","expiryMs","LocalStorageAdapter","IndexedDbAdapter","InMemoryStorageAdapter","keyPrefix","key","value","fullKey","cached","raw","box","k"]}
package/utils/storage.mjs DELETED
@@ -1,134 +0,0 @@
1
- // src/utils/storage.ts
2
- import { kvStore } from "@choksheak/ts-utils/kvStore";
3
- function getStorageAdapter(options, defaultStoreExpiryMs) {
4
- const { localStorageKey, indexedDbKey, storeExpiryMs, store } = options ?? {};
5
- if (store) {
6
- return store;
7
- }
8
- const expiryMs = storeExpiryMs || defaultStoreExpiryMs;
9
- if (localStorageKey) {
10
- return new LocalStorageAdapter(localStorageKey, expiryMs);
11
- }
12
- if (indexedDbKey) {
13
- return new IndexedDbAdapter(indexedDbKey, expiryMs);
14
- }
15
- return null;
16
- }
17
- var InMemoryStorageAdapter = class {
18
- constructor(keyPrefix, expiryMs) {
19
- this.keyPrefix = keyPrefix;
20
- this.expiryMs = expiryMs;
21
- }
22
- cache = /* @__PURE__ */ new Map();
23
- save(key, value) {
24
- const fullKey = this.keyPrefix + ":" + key;
25
- this.cache.set(fullKey, {
26
- value,
27
- expiresAt: Date.now() + this.expiryMs
28
- });
29
- }
30
- load(key) {
31
- const fullKey = this.keyPrefix + ":" + key;
32
- const cached = this.cache.get(fullKey);
33
- if (cached && Date.now() < cached.expiresAt) {
34
- return cached.value;
35
- }
36
- return void 0;
37
- }
38
- delete(key) {
39
- const fullKey = this.keyPrefix + ":" + key;
40
- this.cache.delete(fullKey);
41
- }
42
- clear() {
43
- this.cache.clear();
44
- }
45
- };
46
- var LocalStorageAdapter = class {
47
- constructor(keyPrefix, expiryMs) {
48
- this.keyPrefix = keyPrefix;
49
- this.expiryMs = expiryMs;
50
- }
51
- save(key, value) {
52
- if (typeof window === "undefined") return;
53
- const fullKey = this.keyPrefix + ":" + key;
54
- window.localStorage.setItem(
55
- fullKey,
56
- JSON.stringify({
57
- value,
58
- expiresAt: this.expiryMs ? Date.now() + this.expiryMs : 0
59
- })
60
- );
61
- }
62
- load(key) {
63
- if (typeof window === "undefined") return void 0;
64
- const fullKey = this.keyPrefix + ":" + key;
65
- const raw = window.localStorage.getItem(fullKey);
66
- if (!raw) return void 0;
67
- try {
68
- const box = JSON.parse(raw);
69
- if (!box || box.expiresAt && Date.now() >= box.expiresAt) {
70
- window.localStorage.removeItem(fullKey);
71
- return void 0;
72
- }
73
- return box.value;
74
- } catch {
75
- window.localStorage.removeItem(fullKey);
76
- return void 0;
77
- }
78
- }
79
- delete(key) {
80
- if (typeof window === "undefined") return;
81
- const fullKey = this.keyPrefix + ":" + key;
82
- window.localStorage.removeItem(fullKey);
83
- }
84
- clear() {
85
- if (typeof window === "undefined") return;
86
- for (const key of Object.keys(window.localStorage)) {
87
- if (key.startsWith(this.keyPrefix)) {
88
- window.localStorage.removeItem(key);
89
- }
90
- }
91
- }
92
- };
93
- var IndexedDbAdapter = class {
94
- constructor(keyPrefix, expiryMs) {
95
- this.keyPrefix = keyPrefix;
96
- this.expiryMs = expiryMs;
97
- }
98
- async save(key, value) {
99
- if (typeof window === "undefined") return;
100
- const fullKey = this.keyPrefix + ":" + key;
101
- await kvStore.set(fullKey, JSON.stringify(value), this.expiryMs);
102
- }
103
- async load(key) {
104
- if (typeof window === "undefined") return void 0;
105
- const fullKey = this.keyPrefix + ":" + key;
106
- const raw = await kvStore.get(fullKey);
107
- if (raw === void 0) return void 0;
108
- try {
109
- return JSON.parse(raw);
110
- } catch {
111
- await kvStore.delete(fullKey);
112
- return void 0;
113
- }
114
- }
115
- async delete(key) {
116
- if (typeof window === "undefined") return;
117
- const fullKey = this.keyPrefix + ":" + key;
118
- await kvStore.delete(fullKey);
119
- }
120
- async clear() {
121
- if (typeof window === "undefined") return;
122
- await kvStore.forEach(async (k) => {
123
- if (k.startsWith(this.keyPrefix)) {
124
- await kvStore.delete(k);
125
- }
126
- });
127
- }
128
- };
129
- export {
130
- InMemoryStorageAdapter,
131
- IndexedDbAdapter,
132
- LocalStorageAdapter,
133
- getStorageAdapter
134
- };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/stringify.ts"],"sourcesContent":["/**\n * JSON stringify a value of any type, and returns an unsafe string. The string\n * is \"unsafe\" because you might not be able to restore the original object\n * using the serialized JSON. This is specifically used for query key generation\n * and is not suitable for more general uses.\n *\n * Note: The given value should not contain any functions because functions\n * cannot be serialized and deserialized properly.\n */\nexport function stringifyDeterministicForKeys(params: unknown): string {\n const cache = new Set();\n\n return JSON.stringify(params, (_, value) => {\n if (typeof value === \"function\") {\n throw new Error(`Functions should not be passed into query parameters`);\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return value;\n }\n\n if (cache.has(value)) {\n // Circular reference detected! Return a placeholder string.\n return \"[Circular]\";\n }\n\n cache.add(value);\n\n // Don't crash on circular references, but don't mark the top level object\n // as circular because we want to return as much string as possible.\n if (value !== params) {\n try {\n JSON.stringify(value);\n } catch {\n return \"[Unserializable]\";\n }\n }\n\n return Object.keys(value)\n .sort()\n .reduce(\n (result: Record<string, unknown>, key: string) => {\n result[key] = value[key];\n return result;\n },\n {} as Record<string, unknown>,\n );\n });\n}\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,IAAA,eAAAC,EAAAH,GASO,SAASE,EAA8BE,EAAyB,CACrE,IAAMC,EAAQ,IAAI,IAElB,OAAO,KAAK,UAAUD,EAAQ,CAACE,EAAGC,IAAU,CAC1C,GAAI,OAAOA,GAAU,WACnB,MAAM,IAAI,MAAM,sDAAsD,EAGxE,GAAI,CAACA,GAAS,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EAC5D,OAAOA,EAGT,GAAIF,EAAM,IAAIE,CAAK,EAEjB,MAAO,aAOT,GAJAF,EAAM,IAAIE,CAAK,EAIXA,IAAUH,EACZ,GAAI,CACF,KAAK,UAAUG,CAAK,CACtB,MAAQ,CACN,MAAO,kBACT,CAGF,OAAO,OAAO,KAAKA,CAAK,EACrB,KAAK,EACL,OACC,CAACC,EAAiCC,KAChCD,EAAOC,CAAG,EAAIF,EAAME,CAAG,EAChBD,GAET,CAAC,CACH,CACJ,CAAC,CACH","names":["stringify_exports","__export","stringifyDeterministicForKeys","__toCommonJS","params","cache","_","value","result","key"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/stringify.ts"],"sourcesContent":["/**\n * JSON stringify a value of any type, and returns an unsafe string. The string\n * is \"unsafe\" because you might not be able to restore the original object\n * using the serialized JSON. This is specifically used for query key generation\n * and is not suitable for more general uses.\n *\n * Note: The given value should not contain any functions because functions\n * cannot be serialized and deserialized properly.\n */\nexport function stringifyDeterministicForKeys(params: unknown): string {\n const cache = new Set();\n\n return JSON.stringify(params, (_, value) => {\n if (typeof value === \"function\") {\n throw new Error(`Functions should not be passed into query parameters`);\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return value;\n }\n\n if (cache.has(value)) {\n // Circular reference detected! Return a placeholder string.\n return \"[Circular]\";\n }\n\n cache.add(value);\n\n // Don't crash on circular references, but don't mark the top level object\n // as circular because we want to return as much string as possible.\n if (value !== params) {\n try {\n JSON.stringify(value);\n } catch {\n return \"[Unserializable]\";\n }\n }\n\n return Object.keys(value)\n .sort()\n .reduce(\n (result: Record<string, unknown>, key: string) => {\n result[key] = value[key];\n return result;\n },\n {} as Record<string, unknown>,\n );\n });\n}\n"],"mappings":"AASO,SAASA,EAA8BC,EAAyB,CACrE,IAAMC,EAAQ,IAAI,IAElB,OAAO,KAAK,UAAUD,EAAQ,CAACE,EAAGC,IAAU,CAC1C,GAAI,OAAOA,GAAU,WACnB,MAAM,IAAI,MAAM,sDAAsD,EAGxE,GAAI,CAACA,GAAS,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EAC5D,OAAOA,EAGT,GAAIF,EAAM,IAAIE,CAAK,EAEjB,MAAO,aAOT,GAJAF,EAAM,IAAIE,CAAK,EAIXA,IAAUH,EACZ,GAAI,CACF,KAAK,UAAUG,CAAK,CACtB,MAAQ,CACN,MAAO,kBACT,CAGF,OAAO,OAAO,KAAKA,CAAK,EACrB,KAAK,EACL,OACC,CAACC,EAAiCC,KAChCD,EAAOC,CAAG,EAAIF,EAAME,CAAG,EAChBD,GAET,CAAC,CACH,CACJ,CAAC,CACH","names":["stringifyDeterministicForKeys","params","cache","_","value","result","key"]}
@@ -1,4 +0,0 @@
1
- /** Provides a stable value for T based on deep equality. */
2
- declare function useDeepMemo<T>(value: T): T;
3
-
4
- export { useDeepMemo };
@@ -1,2 +0,0 @@
1
- /** Provides a stable value for T based on deep equality. */
2
- export declare function useDeepMemo<T>(value: T): T;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/useDeepMemo.ts"],"sourcesContent":["import isEqual from \"lodash/isEqual\";\nimport { useMemo, useState } from \"react\";\n\n/** Provides a stable value for T based on deep equality. */\nexport function useDeepMemo<T>(value: T): T {\n const [state, setState] = useState<T>(value);\n\n return useMemo(() => {\n if (state === value || isEqual(state, value)) {\n return state;\n }\n\n // We check equality, so this should be safe.\n // eslint-disable-next-line react-hooks/set-state-in-render\n setState(value);\n\n return value;\n }, [state, value]);\n}\n"],"mappings":"0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAoB,6BACpBC,EAAkC,iBAG3B,SAASH,EAAeI,EAAa,CAC1C,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAAYF,CAAK,EAE3C,SAAO,WAAQ,IACTC,IAAUD,MAAS,EAAAG,SAAQF,EAAOD,CAAK,EAClCC,GAKTC,EAASF,CAAK,EAEPA,GACN,CAACC,EAAOD,CAAK,CAAC,CACnB","names":["useDeepMemo_exports","__export","useDeepMemo","__toCommonJS","import_isEqual","import_react","value","state","setState","isEqual"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/useDeepMemo.ts"],"sourcesContent":["import isEqual from \"lodash/isEqual\";\nimport { useMemo, useState } from \"react\";\n\n/** Provides a stable value for T based on deep equality. */\nexport function useDeepMemo<T>(value: T): T {\n const [state, setState] = useState<T>(value);\n\n return useMemo(() => {\n if (state === value || isEqual(state, value)) {\n return state;\n }\n\n // We check equality, so this should be safe.\n // eslint-disable-next-line react-hooks/set-state-in-render\n setState(value);\n\n return value;\n }, [state, value]);\n}\n"],"mappings":"AAAA,OAAOA,MAAa,iBACpB,OAAS,WAAAC,EAAS,YAAAC,MAAgB,QAG3B,SAASC,EAAeC,EAAa,CAC1C,GAAM,CAACC,EAAOC,CAAQ,EAAIJ,EAAYE,CAAK,EAE3C,OAAOH,EAAQ,IACTI,IAAUD,GAASJ,EAAQK,EAAOD,CAAK,EAClCC,GAKTC,EAASF,CAAK,EAEPA,GACN,CAACC,EAAOD,CAAK,CAAC,CACnB","names":["isEqual","useMemo","useState","useDeepMemo","value","state","setState"]}
File without changes
File without changes
File without changes