katanakit-js 2.2.1 → 2.12.9

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 (148) hide show
  1. package/README.md +72 -437
  2. package/dist/adapters/astro/astro.service.d.ts +103 -15
  3. package/dist/adapters/astro/astro.service.d.ts.map +1 -1
  4. package/dist/adapters/astro/astro.service.js +145 -75
  5. package/dist/adapters/astro/astro.service.js.map +1 -1
  6. package/dist/adapters/astro/index.d.ts +1 -1
  7. package/dist/adapters/astro/index.d.ts.map +1 -1
  8. package/dist/adapters/astro/index.js +1 -1
  9. package/dist/adapters/astro/index.js.map +1 -1
  10. package/dist/adapters/astro/rss.service.d.ts +85 -105
  11. package/dist/adapters/astro/rss.service.d.ts.map +1 -1
  12. package/dist/adapters/astro/rss.service.js +172 -168
  13. package/dist/adapters/astro/rss.service.js.map +1 -1
  14. package/dist/adapters/astro/seo.service.d.ts +10 -0
  15. package/dist/adapters/astro/seo.service.d.ts.map +1 -0
  16. package/dist/adapters/astro/seo.service.js +3 -0
  17. package/dist/adapters/astro/seo.service.js.map +1 -0
  18. package/dist/adapters/express/app.d.ts +30 -1
  19. package/dist/adapters/express/app.d.ts.map +1 -1
  20. package/dist/adapters/express/app.js +31 -3
  21. package/dist/adapters/express/app.js.map +1 -1
  22. package/dist/adapters/express/index.d.ts +2 -2
  23. package/dist/adapters/express/index.d.ts.map +1 -1
  24. package/dist/adapters/express/index.js +2 -2
  25. package/dist/adapters/express/index.js.map +1 -1
  26. package/dist/adapters/express/main.js +2 -2
  27. package/dist/adapters/express/main.js.map +1 -1
  28. package/dist/adapters/express/products.controller.d.ts +67 -8
  29. package/dist/adapters/express/products.controller.d.ts.map +1 -1
  30. package/dist/adapters/express/products.controller.js +105 -49
  31. package/dist/adapters/express/products.controller.js.map +1 -1
  32. package/dist/adapters/express/server.d.ts +37 -13
  33. package/dist/adapters/express/server.d.ts.map +1 -1
  34. package/dist/adapters/express/server.js +118 -53
  35. package/dist/adapters/express/server.js.map +1 -1
  36. package/dist/adapters/nuxt/nuxt.service.d.ts +8 -6
  37. package/dist/adapters/nuxt/nuxt.service.d.ts.map +1 -1
  38. package/dist/adapters/nuxt/nuxt.service.js +34 -10
  39. package/dist/adapters/nuxt/nuxt.service.js.map +1 -1
  40. package/dist/adapters/vue/vue.service.d.ts +5 -2
  41. package/dist/adapters/vue/vue.service.d.ts.map +1 -1
  42. package/dist/adapters/vue/vue.service.js +41 -7
  43. package/dist/adapters/vue/vue.service.js.map +1 -1
  44. package/dist/config/index.d.ts +2 -1
  45. package/dist/config/index.d.ts.map +1 -1
  46. package/dist/config/index.js +1 -1
  47. package/dist/config/index.js.map +1 -1
  48. package/dist/config/seo-meta.types.d.ts +177 -0
  49. package/dist/config/seo-meta.types.d.ts.map +1 -0
  50. package/dist/config/seo-meta.types.js +11 -0
  51. package/dist/config/seo-meta.types.js.map +1 -0
  52. package/dist/config/seo.service.d.ts +41 -58
  53. package/dist/config/seo.service.d.ts.map +1 -1
  54. package/dist/config/seo.service.js +468 -136
  55. package/dist/config/seo.service.js.map +1 -1
  56. package/dist/config/site.config.d.ts +10 -50
  57. package/dist/config/site.config.d.ts.map +1 -1
  58. package/dist/config/site.config.js +8 -36
  59. package/dist/config/site.config.js.map +1 -1
  60. package/dist/core/index.d.ts +1 -3
  61. package/dist/core/index.d.ts.map +1 -1
  62. package/dist/core/index.js +1 -3
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/core/services/dates.service.d.ts +149 -22
  65. package/dist/core/services/dates.service.d.ts.map +1 -1
  66. package/dist/core/services/dates.service.js +201 -54
  67. package/dist/core/services/dates.service.js.map +1 -1
  68. package/dist/core/services/error.service.d.ts +32 -20
  69. package/dist/core/services/error.service.d.ts.map +1 -1
  70. package/dist/core/services/error.service.js +44 -32
  71. package/dist/core/services/error.service.js.map +1 -1
  72. package/dist/core/services/formatter.service.d.ts +245 -35
  73. package/dist/core/services/formatter.service.d.ts.map +1 -1
  74. package/dist/core/services/formatter.service.js +281 -57
  75. package/dist/core/services/formatter.service.js.map +1 -1
  76. package/dist/core/services/generator.service.d.ts +115 -26
  77. package/dist/core/services/generator.service.d.ts.map +1 -1
  78. package/dist/core/services/generator.service.js +191 -56
  79. package/dist/core/services/generator.service.js.map +1 -1
  80. package/dist/core/services/geometry.service.d.ts +369 -39
  81. package/dist/core/services/geometry.service.d.ts.map +1 -1
  82. package/dist/core/services/geometry.service.js +424 -66
  83. package/dist/core/services/geometry.service.js.map +1 -1
  84. package/dist/core/services/http.service.d.ts +244 -21
  85. package/dist/core/services/http.service.d.ts.map +1 -1
  86. package/dist/core/services/http.service.js +419 -98
  87. package/dist/core/services/http.service.js.map +1 -1
  88. package/dist/core/services/logger.service.d.ts +95 -29
  89. package/dist/core/services/logger.service.d.ts.map +1 -1
  90. package/dist/core/services/logger.service.js +167 -41
  91. package/dist/core/services/logger.service.js.map +1 -1
  92. package/dist/core/services/reactive.service.d.ts +146 -19
  93. package/dist/core/services/reactive.service.d.ts.map +1 -1
  94. package/dist/core/services/reactive.service.js +278 -137
  95. package/dist/core/services/reactive.service.js.map +1 -1
  96. package/dist/core/services/timing.service.d.ts +142 -20
  97. package/dist/core/services/timing.service.d.ts.map +1 -1
  98. package/dist/core/services/timing.service.js +324 -185
  99. package/dist/core/services/timing.service.js.map +1 -1
  100. package/dist/core/services/utils.service.d.ts +228 -43
  101. package/dist/core/services/utils.service.d.ts.map +1 -1
  102. package/dist/core/services/utils.service.js +305 -125
  103. package/dist/core/services/utils.service.js.map +1 -1
  104. package/dist/infrastructure/dom/dom.service.d.ts +307 -44
  105. package/dist/infrastructure/dom/dom.service.d.ts.map +1 -1
  106. package/dist/infrastructure/dom/dom.service.js +408 -129
  107. package/dist/infrastructure/dom/dom.service.js.map +1 -1
  108. package/dist/infrastructure/index.d.ts +0 -3
  109. package/dist/infrastructure/index.d.ts.map +1 -1
  110. package/dist/infrastructure/index.js +0 -3
  111. package/dist/infrastructure/index.js.map +1 -1
  112. package/dist/infrastructure/observer/observer.service.d.ts +124 -31
  113. package/dist/infrastructure/observer/observer.service.d.ts.map +1 -1
  114. package/dist/infrastructure/observer/observer.service.js +227 -131
  115. package/dist/infrastructure/observer/observer.service.js.map +1 -1
  116. package/dist/infrastructure/sensors/sensors.service.d.ts +154 -22
  117. package/dist/infrastructure/sensors/sensors.service.d.ts.map +1 -1
  118. package/dist/infrastructure/sensors/sensors.service.js +264 -112
  119. package/dist/infrastructure/sensors/sensors.service.js.map +1 -1
  120. package/dist/infrastructure/storage/storage.service.d.ts +123 -45
  121. package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
  122. package/dist/infrastructure/storage/storage.service.js +236 -66
  123. package/dist/infrastructure/storage/storage.service.js.map +1 -1
  124. package/dist/infrastructure/theme/theme.service.d.ts +93 -29
  125. package/dist/infrastructure/theme/theme.service.d.ts.map +1 -1
  126. package/dist/infrastructure/theme/theme.service.js +198 -96
  127. package/dist/infrastructure/theme/theme.service.js.map +1 -1
  128. package/dist/infrastructure/viewport/viewport.service.d.ts +233 -35
  129. package/dist/infrastructure/viewport/viewport.service.d.ts.map +1 -1
  130. package/dist/infrastructure/viewport/viewport.service.js +358 -139
  131. package/dist/infrastructure/viewport/viewport.service.js.map +1 -1
  132. package/dist/infrastructure/worker/worker.service.d.ts +84 -38
  133. package/dist/infrastructure/worker/worker.service.d.ts.map +1 -1
  134. package/dist/infrastructure/worker/worker.service.js +234 -133
  135. package/dist/infrastructure/worker/worker.service.js.map +1 -1
  136. package/dist/prisma/index.d.ts +2 -0
  137. package/dist/prisma/index.d.ts.map +1 -0
  138. package/dist/prisma/index.js +2 -0
  139. package/dist/prisma/index.js.map +1 -0
  140. package/dist/prisma/schema.json +11 -33
  141. package/dist/prisma/use-prisma.d.ts +68 -0
  142. package/dist/prisma/use-prisma.d.ts.map +1 -0
  143. package/dist/prisma/use-prisma.js +82 -0
  144. package/dist/prisma/use-prisma.js.map +1 -0
  145. package/dist/types/index.d.ts +20 -12
  146. package/dist/types/index.d.ts.map +1 -1
  147. package/package.json +124 -125
  148. package/CHANGELOG.md +0 -101
@@ -1,48 +1,126 @@
1
1
  import type { StorageStrategy, StorageTarget } from "../../types/index.js";
2
2
  /**
3
- * Base strategy handling safe JSON serialization over a Web Storage backend.
4
- */
5
- declare abstract class WebStorageStrategy implements StorageStrategy {
6
- private readonly storage;
7
- protected constructor(storage: Storage);
8
- useGetItem<T = unknown>(key: string): T | null;
9
- useSetItem(key: string, value: unknown): void;
10
- useRemoveItem(key: string): void;
11
- useClear(): void;
12
- }
13
- /**
14
- * Concrete strategy backed by `window.localStorage`.
15
- */
16
- export declare class LocalStorageStrategy extends WebStorageStrategy {
17
- constructor();
18
- }
19
- /**
20
- * Concrete strategy backed by `window.sessionStorage`.
21
- */
22
- export declare class SessionStorageStrategy extends WebStorageStrategy {
23
- constructor();
24
- }
25
- /**
26
- * Concrete strategy backed by an in-memory store (SSR fallback).
27
- */
28
- export declare class MemoryStorageStrategy extends WebStorageStrategy {
29
- constructor();
30
- }
31
- /**
32
- * Storage facade (Singleton + Strategy). Lazily picks browser storage or an
33
- * in-memory fallback so importing this module never crashes in SSR (Node/Bun).
34
- */
35
- export default class StorageService {
36
- private static instance;
37
- private strategies;
38
- private constructor();
39
- static getInstance(): StorageService;
40
- private getStrategies;
41
- useGetStorage: <T = unknown>(key: string, target?: StorageTarget) => T | null;
42
- useSetStorage: (key: string, value: unknown, target?: StorageTarget) => void;
43
- useRemoveStorage: (key: string, target?: StorageTarget) => void;
44
- useClearStorage: (target?: StorageTarget) => void;
45
- }
46
- export declare const useClearStorage: (target?: StorageTarget) => void, useGetStorage: <T = unknown>(key: string, target?: StorageTarget) => T | null, useRemoveStorage: (key: string, target?: StorageTarget) => void, useSetStorage: (key: string, value: unknown, target?: StorageTarget) => void;
47
- export {};
3
+ * Creates a new in-memory `Storage` instance.
4
+ *
5
+ * @returns A fresh `MemoryStorage` that conforms to the Web Storage API.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const mem = createMemoryStorage();
10
+ * mem.setItem("key", JSON.stringify({ a: 1 }));
11
+ * ```
12
+ */
13
+ export declare function createMemoryStorage(): Storage;
14
+ /**
15
+ * Creates a strategy backed by `window.localStorage`.
16
+ *
17
+ * @param storage - Optional storage instance (defaults to `window.localStorage`).
18
+ * @returns A {@link StorageStrategy}.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const strategy = LocalStorageStrategy();
23
+ * strategy.useSetItem("token", "abc123");
24
+ * ```
25
+ */
26
+ export declare function LocalStorageStrategy(storage?: Storage): StorageStrategy;
27
+ /**
28
+ * Creates a strategy backed by `window.sessionStorage`.
29
+ *
30
+ * @param storage - Optional storage instance (defaults to `window.sessionStorage`).
31
+ * @returns A {@link StorageStrategy}.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const strategy = SessionStorageStrategy();
36
+ * strategy.useSetItem("session", data);
37
+ * ```
38
+ */
39
+ export declare function SessionStorageStrategy(storage?: Storage): StorageStrategy;
40
+ /**
41
+ * Creates a strategy backed by an in-memory store (SSR / private-mode fallback).
42
+ *
43
+ * @returns A {@link StorageStrategy} using an in-memory `Storage` backend.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const strategy = MemoryStorageStrategy();
48
+ * strategy.useSetItem("temp", "value");
49
+ * ```
50
+ */
51
+ export declare function MemoryStorageStrategy(): StorageStrategy;
52
+ /**
53
+ * Runs `fn` with request-isolated in-memory storage (SSR).
54
+ * Use this around a request handler so `useSetStorage` / `useGetStorage`
55
+ * share state within the request but not across requests.
56
+ *
57
+ * @typeParam T - Return type of `fn`.
58
+ * @param fn - The function to run within the storage scope.
59
+ * @returns The return value of `fn`.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * import { useRunStorageScope, useSetStorage, useGetStorage } from "katanakit-js";
64
+ *
65
+ * export default defineEventHandler((event) => {
66
+ * return useRunStorageScope(() => {
67
+ * useSetStorage("req-id", event.context.id);
68
+ * return useGetStorage("req-id");
69
+ * });
70
+ * });
71
+ * ```
72
+ */
73
+ export declare function useRunStorageScope<T>(fn: () => T): T;
74
+ /**
75
+ * Retrieves a value from storage by key.
76
+ *
77
+ * @typeParam T - Expected value type.
78
+ * @param key - The storage key.
79
+ * @param target - Which storage backend to use (default: `"localStorage"`).
80
+ * @returns The deserialized value, or `null` if not found.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const token = useGetStorage<string>("auth_token");
85
+ * const session = useGetStorage<SessionData>("session", "sessionStorage");
86
+ * ```
87
+ */
88
+ export declare const useGetStorage: <T = unknown>(key: string, target?: StorageTarget) => T | null;
89
+ /**
90
+ * Stores a value under the given key (serialized as JSON).
91
+ *
92
+ * @param key - The storage key.
93
+ * @param value - The value to store.
94
+ * @param target - Which storage backend to use (default: `"localStorage"`).
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * useSetStorage("auth_token", "abc123");
99
+ * useSetStorage("user", { name: "Alice" }, "sessionStorage");
100
+ * ```
101
+ */
102
+ export declare const useSetStorage: (key: string, value: unknown, target?: StorageTarget) => void;
103
+ /**
104
+ * Removes a value from storage by key.
105
+ *
106
+ * @param key - The storage key to remove.
107
+ * @param target - Which storage backend to use (default: `"localStorage"`).
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * useRemoveStorage("auth_token");
112
+ * ```
113
+ */
114
+ export declare const useRemoveStorage: (key: string, target?: StorageTarget) => void;
115
+ /**
116
+ * Clears all values from the specified storage backend.
117
+ *
118
+ * @param target - Which storage backend to clear (default: `"localStorage"`).
119
+ *
120
+ * @example
121
+ * ```ts
122
+ * useClearStorage("sessionStorage");
123
+ * ```
124
+ */
125
+ export declare const useClearStorage: (target?: StorageTarget) => void;
48
126
  //# sourceMappingURL=storage.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/storage/storage.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E;;GAEG;AACH,uBAAe,kBAAmB,YAAW,eAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA9C,SAAS,aAA8B,OAAO,EAAE,OAAO,EAAI;IAE3D,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAO7C;IAED,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAG5C;IAED,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/B;IAED,QAAQ,IAAI,IAAI,CAEf;CACD;AAiCD;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC3D,cAEC;CACD;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC7D,cAEC;CACD;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,kBAAkB;IAC5D,cAEC;CACD;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAuD;IAEzE,OAAO,eAAiB;IAExB,OAAc,WAAW,IAAI,cAAc,CAK1C;IAED,OAAO,CAAC,aAAa;IAWd,aAAa,GAAI,CAAC,GAAG,OAAO,OAC7B,MAAM,WACH,aAAa,KACnB,CAAC,GAAG,IAAI,CAAoD;IAExD,aAAa,QACd,MAAM,SACJ,OAAO,WACN,aAAa,KACnB,IAAI,CAAwD;IAExD,gBAAgB,QAAS,MAAM,WAAU,aAAa,KAAoB,IAAI,CACpC;IAE1C,eAAe,YAAY,aAAa,KAAoB,IAAI,CAC9B;CACzC;AAGD,eAAO,MAAQ,eAAe,YALK,aAAa,KAAoB,IAAI,EAKxC,aAAa,GAnBpB,CAAC,iBACnB,MAAM,WACH,aAAa,eAiBwB,gBAAgB,QAR9B,MAAM,WAAU,aAAa,KAAoB,IAAI,EAQrB,aAAa,QAbvE,MAAM,SACJ,OAAO,WACN,aAAa,KACnB,IAWyB,CAAC"}
1
+ {"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/storage/storage.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA2F3E;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,OAA6B,GAAG,eAAe,CAE5F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,OAA+B,GAAG,eAAe,CAEhG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD;AA0ED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEpD;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,GAAG,OAAO,OACnC,MAAM,WACH,aAAa,KACnB,CAAC,GAAG,IAAkD,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,QACpB,MAAM,SACJ,OAAO,WACN,aAAa,KACnB,IAAsD,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,QAAS,MAAM,WAAU,aAAa,KAAoB,IAC5C,CAAC;AAE5C;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,YAAY,aAAa,KAAoB,IACtC,CAAC"}
@@ -1,33 +1,63 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ // ============================================================
3
+ // Strategy factories (plain objects implementing StorageStrategy)
4
+ // ============================================================
1
5
  /**
2
- * Base strategy handling safe JSON serialization over a Web Storage backend.
6
+ * Creates a `StorageStrategy` backed by a Web Storage backend (`localStorage`
7
+ * or `sessionStorage`) with safe JSON serialization and error handling.
8
+ *
9
+ * @param storage - A native `Storage` instance (e.g. `window.localStorage`).
10
+ * @returns A {@link StorageStrategy} object.
3
11
  */
4
- class WebStorageStrategy {
5
- storage;
6
- constructor(storage) {
7
- this.storage = storage;
8
- }
9
- useGetItem(key) {
10
- try {
11
- const raw = this.storage.getItem(key);
12
- return raw ? JSON.parse(raw) : null;
13
- }
14
- catch {
15
- return this.storage.getItem(key);
16
- }
17
- }
18
- useSetItem(key, value) {
19
- const serialized = typeof value === "string" ? value : JSON.stringify(value);
20
- this.storage.setItem(key, serialized);
21
- }
22
- useRemoveItem(key) {
23
- this.storage.removeItem(key);
24
- }
25
- useClear() {
26
- this.storage.clear();
27
- }
12
+ function createWebStorageStrategy(storage) {
13
+ return {
14
+ useGetItem(key) {
15
+ try {
16
+ const raw = storage.getItem(key);
17
+ return raw ? JSON.parse(raw) : null;
18
+ }
19
+ catch {
20
+ try {
21
+ return storage.getItem(key);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ },
28
+ useSetItem(key, value) {
29
+ try {
30
+ const serialized = typeof value === "string" ? value : JSON.stringify(value);
31
+ storage.setItem(key, serialized);
32
+ }
33
+ catch {
34
+ // Quota exceeded, private mode, or unavailable storage — ignore.
35
+ }
36
+ },
37
+ useRemoveItem(key) {
38
+ try {
39
+ storage.removeItem(key);
40
+ }
41
+ catch {
42
+ // Ignore unavailable storage.
43
+ }
44
+ },
45
+ useClear() {
46
+ try {
47
+ storage.clear();
48
+ }
49
+ catch {
50
+ // Ignore unavailable storage.
51
+ }
52
+ },
53
+ };
28
54
  }
55
+ // ============================================================
56
+ // In-memory Storage implementation
57
+ // ============================================================
29
58
  /**
30
- * In-memory Web Storage implementation used as an SSR fallback.
59
+ * In-memory `Storage` implementation used as an SSR / private-mode fallback.
60
+ * Each instance owns its own Map — never share one across requests.
31
61
  */
32
62
  class MemoryStorage {
33
63
  store = new Map();
@@ -51,58 +81,198 @@ class MemoryStorage {
51
81
  }
52
82
  }
53
83
  /**
54
- * Concrete strategy backed by `window.localStorage`.
84
+ * Creates a new in-memory `Storage` instance.
85
+ *
86
+ * @returns A fresh `MemoryStorage` that conforms to the Web Storage API.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * const mem = createMemoryStorage();
91
+ * mem.setItem("key", JSON.stringify({ a: 1 }));
92
+ * ```
55
93
  */
56
- export class LocalStorageStrategy extends WebStorageStrategy {
57
- constructor() {
58
- super(window.localStorage);
59
- }
94
+ export function createMemoryStorage() {
95
+ return new MemoryStorage();
60
96
  }
97
+ // ============================================================
98
+ // Concrete strategy factories
99
+ // ============================================================
61
100
  /**
62
- * Concrete strategy backed by `window.sessionStorage`.
101
+ * Creates a strategy backed by `window.localStorage`.
102
+ *
103
+ * @param storage - Optional storage instance (defaults to `window.localStorage`).
104
+ * @returns A {@link StorageStrategy}.
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * const strategy = LocalStorageStrategy();
109
+ * strategy.useSetItem("token", "abc123");
110
+ * ```
63
111
  */
64
- export class SessionStorageStrategy extends WebStorageStrategy {
65
- constructor() {
66
- super(window.sessionStorage);
67
- }
112
+ export function LocalStorageStrategy(storage = window.localStorage) {
113
+ return createWebStorageStrategy(storage);
68
114
  }
69
115
  /**
70
- * Concrete strategy backed by an in-memory store (SSR fallback).
116
+ * Creates a strategy backed by `window.sessionStorage`.
117
+ *
118
+ * @param storage - Optional storage instance (defaults to `window.sessionStorage`).
119
+ * @returns A {@link StorageStrategy}.
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * const strategy = SessionStorageStrategy();
124
+ * strategy.useSetItem("session", data);
125
+ * ```
71
126
  */
72
- export class MemoryStorageStrategy extends WebStorageStrategy {
73
- constructor() {
74
- super(new MemoryStorage());
75
- }
127
+ export function SessionStorageStrategy(storage = window.sessionStorage) {
128
+ return createWebStorageStrategy(storage);
76
129
  }
77
130
  /**
78
- * Storage facade (Singleton + Strategy). Lazily picks browser storage or an
79
- * in-memory fallback so importing this module never crashes in SSR (Node/Bun).
131
+ * Creates a strategy backed by an in-memory store (SSR / private-mode fallback).
132
+ *
133
+ * @returns A {@link StorageStrategy} using an in-memory `Storage` backend.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * const strategy = MemoryStorageStrategy();
138
+ * strategy.useSetItem("temp", "value");
139
+ * ```
80
140
  */
81
- export default class StorageService {
82
- static instance;
83
- strategies = null;
84
- constructor() { }
85
- static getInstance() {
86
- if (!StorageService.instance) {
87
- StorageService.instance = new StorageService();
88
- }
89
- return StorageService.instance;
141
+ export function MemoryStorageStrategy() {
142
+ return createWebStorageStrategy(createMemoryStorage());
143
+ }
144
+ /** Request-scoped storage strategies for SSR (avoids cross-request leaks). */
145
+ const ssrStorageAls = new AsyncLocalStorage();
146
+ /** Lazily-initialized browser strategies (cached once). */
147
+ let browserStrategies = null;
148
+ function createMemoryStrategies() {
149
+ return {
150
+ localStorage: MemoryStorageStrategy(),
151
+ sessionStorage: MemoryStorageStrategy(),
152
+ };
153
+ }
154
+ function tryCreateBrowserStrategies() {
155
+ const local = tryCreateWebStorage("localStorage");
156
+ const session = tryCreateWebStorage("sessionStorage");
157
+ return {
158
+ localStorage: local ?? MemoryStorageStrategy(),
159
+ sessionStorage: session ?? MemoryStorageStrategy(),
160
+ };
161
+ }
162
+ /**
163
+ * Probes Web Storage availability (Safari private mode throws on setItem).
164
+ *
165
+ * @param kind - Which storage backend to probe.
166
+ * @returns A {@link StorageStrategy} or `null` if the backend is unavailable.
167
+ */
168
+ function tryCreateWebStorage(kind) {
169
+ try {
170
+ const storage = window[kind];
171
+ const probeKey = "__kk_storage_probe__";
172
+ storage.setItem(probeKey, "1");
173
+ storage.removeItem(probeKey);
174
+ return kind === "localStorage" ? LocalStorageStrategy(storage) : SessionStorageStrategy(storage);
90
175
  }
91
- getStrategies() {
92
- if (!this.strategies) {
93
- const hasWindow = typeof window !== "undefined";
94
- this.strategies = {
95
- localStorage: hasWindow ? new LocalStorageStrategy() : new MemoryStorageStrategy(),
96
- sessionStorage: hasWindow ? new SessionStorageStrategy() : new MemoryStorageStrategy(),
97
- };
176
+ catch {
177
+ return null;
178
+ }
179
+ }
180
+ /**
181
+ * Resolves the active strategy map: browser strategies (cached), ALS-scoped
182
+ * strategies (SSR request), or ephemeral memory strategies (SSR fallback).
183
+ */
184
+ function getStrategies() {
185
+ const hasWindow = typeof window !== "undefined";
186
+ if (hasWindow) {
187
+ if (!browserStrategies) {
188
+ browserStrategies = tryCreateBrowserStrategies();
98
189
  }
99
- return this.strategies;
190
+ return browserStrategies;
100
191
  }
101
- useGetStorage = (key, target = "localStorage") => this.getStrategies()[target].useGetItem(key);
102
- useSetStorage = (key, value, target = "localStorage") => this.getStrategies()[target].useSetItem(key, value);
103
- useRemoveStorage = (key, target = "localStorage") => this.getStrategies()[target].useRemoveItem(key);
104
- useClearStorage = (target = "localStorage") => this.getStrategies()[target].useClear();
192
+ // SSR: prefer ALS-scoped strategies (isolated per request).
193
+ const scoped = ssrStorageAls.getStore();
194
+ if (scoped)
195
+ return scoped;
196
+ // No scope — ephemeral store (no cross-request leak, no cross-call persistence).
197
+ return createMemoryStrategies();
105
198
  }
106
- // Singleton instance and destructured exports.
107
- export const { useClearStorage, useGetStorage, useRemoveStorage, useSetStorage } = StorageService.getInstance();
199
+ // ============================================================
200
+ // Public API
201
+ // ============================================================
202
+ /**
203
+ * Runs `fn` with request-isolated in-memory storage (SSR).
204
+ * Use this around a request handler so `useSetStorage` / `useGetStorage`
205
+ * share state within the request but not across requests.
206
+ *
207
+ * @typeParam T - Return type of `fn`.
208
+ * @param fn - The function to run within the storage scope.
209
+ * @returns The return value of `fn`.
210
+ *
211
+ * @example
212
+ * ```ts
213
+ * import { useRunStorageScope, useSetStorage, useGetStorage } from "katanakit-js";
214
+ *
215
+ * export default defineEventHandler((event) => {
216
+ * return useRunStorageScope(() => {
217
+ * useSetStorage("req-id", event.context.id);
218
+ * return useGetStorage("req-id");
219
+ * });
220
+ * });
221
+ * ```
222
+ */
223
+ export function useRunStorageScope(fn) {
224
+ return ssrStorageAls.run(createMemoryStrategies(), fn);
225
+ }
226
+ /**
227
+ * Retrieves a value from storage by key.
228
+ *
229
+ * @typeParam T - Expected value type.
230
+ * @param key - The storage key.
231
+ * @param target - Which storage backend to use (default: `"localStorage"`).
232
+ * @returns The deserialized value, or `null` if not found.
233
+ *
234
+ * @example
235
+ * ```ts
236
+ * const token = useGetStorage<string>("auth_token");
237
+ * const session = useGetStorage<SessionData>("session", "sessionStorage");
238
+ * ```
239
+ */
240
+ export const useGetStorage = (key, target = "localStorage") => getStrategies()[target].useGetItem(key);
241
+ /**
242
+ * Stores a value under the given key (serialized as JSON).
243
+ *
244
+ * @param key - The storage key.
245
+ * @param value - The value to store.
246
+ * @param target - Which storage backend to use (default: `"localStorage"`).
247
+ *
248
+ * @example
249
+ * ```ts
250
+ * useSetStorage("auth_token", "abc123");
251
+ * useSetStorage("user", { name: "Alice" }, "sessionStorage");
252
+ * ```
253
+ */
254
+ export const useSetStorage = (key, value, target = "localStorage") => getStrategies()[target].useSetItem(key, value);
255
+ /**
256
+ * Removes a value from storage by key.
257
+ *
258
+ * @param key - The storage key to remove.
259
+ * @param target - Which storage backend to use (default: `"localStorage"`).
260
+ *
261
+ * @example
262
+ * ```ts
263
+ * useRemoveStorage("auth_token");
264
+ * ```
265
+ */
266
+ export const useRemoveStorage = (key, target = "localStorage") => getStrategies()[target].useRemoveItem(key);
267
+ /**
268
+ * Clears all values from the specified storage backend.
269
+ *
270
+ * @param target - Which storage backend to clear (default: `"localStorage"`).
271
+ *
272
+ * @example
273
+ * ```ts
274
+ * useClearStorage("sessionStorage");
275
+ * ```
276
+ */
277
+ export const useClearStorage = (target = "localStorage") => getStrategies()[target].useClear();
108
278
  //# sourceMappingURL=storage.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../../src/infrastructure/storage/storage.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../../src/infrastructure/storage/storage.service.ts"],"names":[],"mappings":"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"}
@@ -1,30 +1,94 @@
1
- import type { IThemeService, ThemeMode, ThemeOptions } from "../../types/index.js";
2
- /**
3
- * Theme facade (Singleton) over the DOM and Storage, with a media-query listener.
4
- */
5
- export declare class ThemeService implements IThemeService {
6
- private static instance;
7
- private mode;
8
- private storageKey;
9
- private attribute;
10
- private target;
11
- private onChange?;
12
- private mediaQuery;
13
- private cleanMediaQueryListener;
14
- private constructor();
15
- static getInstance(): ThemeService;
16
- private IS_BROWSER;
17
- useInitTheme: (options?: ThemeOptions) => void;
18
- useSetThemeMode: (mode: ThemeMode) => void;
19
- useGetThemeMode: () => ThemeMode;
20
- useGetResolved: () => "light" | "dark";
21
- usePrefersColorScheme: () => boolean;
22
- useToggleTheme: () => void;
23
- useResetTheme: () => void;
24
- useDestroyTheme: () => void;
25
- private APPLY_THEME;
26
- private SETUP_MEDIA_QUERY_LISTENER;
27
- }
28
- export declare const THEME_SERVICE: ThemeService;
29
- export declare const useInitTheme: (options?: ThemeOptions) => void, useSetThemeMode: (mode: ThemeMode) => void, useGetThemeMode: () => ThemeMode, useGetResolved: () => "light" | "dark", usePrefersColorScheme: () => boolean, useToggleTheme: () => void, useResetTheme: () => void, useDestroyTheme: () => void;
1
+ import type { ThemeMode, ThemeOptions } from "../../types/index.js";
2
+ /**
3
+ * Initializes the theme system. Reads the stored preference (or falls back
4
+ * to `defaultMode`), applies the theme, and registers a system color-scheme
5
+ * listener for `"system"` mode.
6
+ *
7
+ * @param options - Configuration for the theme system.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * useInitTheme({
12
+ * defaultMode: "dark",
13
+ * storageKey: "app-theme",
14
+ * onChange: (mode, resolved) => console.log(mode, resolved),
15
+ * });
16
+ * ```
17
+ */
18
+ export declare const useInitTheme: (options?: ThemeOptions) => void;
19
+ /**
20
+ * Sets the theme mode and persists it to storage.
21
+ *
22
+ * @param newMode - The desired theme mode (`"light"`, `"dark"`, or `"system"`).
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * useSetThemeMode("dark");
27
+ * ```
28
+ */
29
+ export declare const useSetThemeMode: (newMode: ThemeMode) => void;
30
+ /**
31
+ * Returns the current theme mode (may be `"system"`).
32
+ *
33
+ * @returns The active {@link ThemeMode}.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * const current = useGetThemeMode(); // "light" | "dark" | "system"
38
+ * ```
39
+ */
40
+ export declare const useGetThemeMode: () => ThemeMode;
41
+ /**
42
+ * Returns the resolved theme (`"light"` or `"dark"`), accounting for system
43
+ * preference when mode is `"system"`.
44
+ *
45
+ * @returns The resolved color scheme.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const scheme = useGetResolved(); // "light" or "dark"
50
+ * ```
51
+ */
52
+ export declare const useGetResolved: () => "light" | "dark";
53
+ /**
54
+ * Checks whether the user's OS is set to prefer a dark color scheme.
55
+ *
56
+ * @returns `true` if the system prefers dark mode.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * if (usePrefersColorScheme()) {
61
+ * // user prefers dark
62
+ * }
63
+ * ```
64
+ */
65
+ export declare const usePrefersColorScheme: () => boolean;
66
+ /**
67
+ * Toggles between `"light"` and `"dark"` (ignores `"system"`).
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * useToggleTheme(); // light -> dark, dark -> light
72
+ * ```
73
+ */
74
+ export declare const useToggleTheme: () => void;
75
+ /**
76
+ * Resets the theme to `"system"` and removes the stored preference.
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * useResetTheme();
81
+ * ```
82
+ */
83
+ export declare const useResetTheme: () => void;
84
+ /**
85
+ * Cleans up the media-query listener. Call this when the theme system is
86
+ * no longer needed (e.g. during teardown in tests).
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * useDestroyTheme();
91
+ * ```
92
+ */
93
+ export declare const useDestroyTheme: () => void;
30
94
  //# sourceMappingURL=theme.service.d.ts.map