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,143 +1,323 @@
1
1
  /**
2
- * Data utilities implemented as a Singleton.
2
+ * Returns a new array with duplicate values removed, preserving first-seen order.
3
+ *
4
+ * @typeParam T - Element type.
5
+ * @param array - The input array.
6
+ * @returns A new array with unique values.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * useUnique([1, 2, 2, 3, 1]); // [1, 2, 3]
11
+ * useUnique(["a", "b", "a"]); // ["a", "b"]
12
+ * ```
3
13
  */
4
- export class DataUtils {
5
- static instance;
6
- constructor() { }
7
- static getInstance() {
8
- if (!DataUtils.instance) {
9
- DataUtils.instance = new DataUtils();
14
+ export function useUnique(array) {
15
+ return [...new Set(array)];
16
+ }
17
+ /**
18
+ * Splits an array into chunks of the given size.
19
+ *
20
+ * @typeParam T - Element type.
21
+ * @param array - The input array.
22
+ * @param size - Number of elements per chunk (must be > 0).
23
+ * @returns An array of chunks.
24
+ * @throws {Error} If `size` is less than or equal to 0.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * useChunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]
29
+ * useChunk(["a", "b", "c"], 1); // [["a"], ["b"], ["c"]]
30
+ * ```
31
+ */
32
+ export function useChunk(array, size) {
33
+ if (size <= 0)
34
+ throw new Error("Chunk size must be greater than 0");
35
+ return Array.from({ length: Math.ceil(array.length / size) }, (_, i) => array.slice(i * size, i * size + size));
36
+ }
37
+ /**
38
+ * Groups array items by a key property or key selector function.
39
+ *
40
+ * @typeParam T - Element type.
41
+ * @param array - The input array.
42
+ * @param key - A property name or a function that returns the group key.
43
+ * @returns An object mapping group keys to arrays of items.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const items = [
48
+ * { type: "fruit", name: "apple" },
49
+ * { type: "veggie", name: "carrot" },
50
+ * { type: "fruit", name: "banana" },
51
+ * ];
52
+ * useGroupBy(items, "type");
53
+ * // { fruit: [{ type: "fruit", name: "apple" }, { type: "fruit", name: "banana" }], veggie: [...] }
54
+ *
55
+ * useGroupBy(items, (item) => item.type.toUpperCase());
56
+ * // { FRUIT: [...], VEGGIE: [...] }
57
+ * ```
58
+ */
59
+ export function useGroupBy(array, key) {
60
+ return array.reduce((acc, item) => {
61
+ const groupKey = typeof key === "function" ? key(item) : String(item[key]);
62
+ if (!acc[groupKey]) {
63
+ acc[groupKey] = [];
10
64
  }
11
- return DataUtils.instance;
65
+ acc[groupKey].push(item);
66
+ return acc;
67
+ }, {});
68
+ }
69
+ /**
70
+ * Type guard that checks whether a value is a plain object (not null, not
71
+ * an array).
72
+ *
73
+ * @param item - The value to test.
74
+ * @returns `true` if the value is a plain `Record<string, unknown>`.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * useIsObject({ a: 1 }); // true
79
+ * useIsObject([1, 2]); // false
80
+ * useIsObject(null); // false
81
+ * useIsObject("hello"); // false
82
+ * ```
83
+ */
84
+ export function useIsObject(item) {
85
+ return typeof item === "object" && item !== null && !Array.isArray(item);
86
+ }
87
+ /**
88
+ * Deep clones a value using `structuredClone` with a JSON fallback for
89
+ * environments that do not support it.
90
+ *
91
+ * @typeParam T - Value type.
92
+ * @param value - The value to clone.
93
+ * @returns A deep copy of the value.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * const original = { a: { b: 1 } };
98
+ * const copy = useDeepClone(original);
99
+ * copy.a.b = 2;
100
+ * original.a.b; // 1 (unchanged)
101
+ * ```
102
+ */
103
+ export function useDeepClone(value) {
104
+ if (typeof structuredClone === "function") {
105
+ return structuredClone(value);
12
106
  }
13
- useUnique = (array) => [...new Set(array)];
14
- useChunk = (array, size) => {
15
- if (size <= 0)
16
- throw new Error("Chunk size must be greater than 0");
17
- return Array.from({ length: Math.ceil(array.length / size) }, (_, i) => array.slice(i * size, i * size + size));
18
- };
19
- useGroupBy = (array, key) => {
20
- return array.reduce((acc, item) => {
21
- const groupKey = typeof key === "function" ? key(item) : String(item[key]);
22
- if (!acc[groupKey]) {
23
- acc[groupKey] = [];
24
- }
25
- acc[groupKey].push(item);
26
- return acc;
27
- }, {});
28
- };
29
- useIsObject = (item) => typeof item === "object" && item !== null && !Array.isArray(item);
30
- useDeepClone = (value) => {
31
- if (typeof structuredClone === "function") {
32
- return structuredClone(value);
107
+ return JSON.parse(JSON.stringify(value));
108
+ }
109
+ /**
110
+ * Deep merges `source` into a shallow copy of `target`. Nested plain
111
+ * objects are merged recursively. Skips prototype-pollution keys
112
+ * (`__proto__`, `constructor`, `prototype`).
113
+ *
114
+ * @typeParam T - Target object type.
115
+ * @param target - The base object (not mutated).
116
+ * @param source - The object to merge in.
117
+ * @returns A new merged object.
118
+ *
119
+ * @example
120
+ * ```ts
121
+ * const base = { a: 1, b: { c: 2, d: 3 } };
122
+ * const override = { b: { c: 99, e: 4 }, f: 5 };
123
+ * useDeepMerge(base, override);
124
+ * // { a: 1, b: { c: 99, d: 3, e: 4 }, f: 5 }
125
+ * ```
126
+ */
127
+ export function useDeepMerge(target, source) {
128
+ if (!target || !source)
129
+ return { ...target };
130
+ const output = { ...target };
131
+ const dangerousKeys = new Set(["__proto__", "constructor", "prototype"]);
132
+ for (const key of Object.keys(source)) {
133
+ if (dangerousKeys.has(key))
134
+ continue;
135
+ const targetVal = target[key];
136
+ const sourceVal = source[key];
137
+ if (useIsObject(targetVal) && useIsObject(sourceVal)) {
138
+ output[key] = useDeepMerge(targetVal, sourceVal);
33
139
  }
34
- return JSON.parse(JSON.stringify(value));
35
- };
36
- useDeepMerge = (target, source) => {
37
- if (!target || !source)
38
- return { ...target };
39
- const output = { ...target };
40
- for (const key of Object.keys(source)) {
41
- const targetVal = target[key];
42
- const sourceVal = source[key];
43
- if (this.useIsObject(targetVal) && this.useIsObject(sourceVal)) {
44
- output[key] = this.useDeepMerge(targetVal, sourceVal);
45
- }
46
- else {
47
- output[key] = sourceVal;
48
- }
140
+ else {
141
+ output[key] = sourceVal;
49
142
  }
50
- return output;
51
- };
52
- usePick = (obj, keys) => {
53
- return keys.reduce((acc, key) => {
54
- if (key in obj)
55
- acc[key] = obj[key];
56
- return acc;
57
- }, {});
58
- };
59
- useOmit = (obj, keys) => {
60
- const result = this.useDeepClone(obj);
61
- for (const key of keys)
62
- delete result[key];
63
- return result;
64
- };
143
+ }
144
+ return output;
65
145
  }
66
146
  /**
67
- * System utilities implemented as a Singleton.
147
+ * Picks the listed keys from an object into a new object.
148
+ *
149
+ * @typeParam T - Source object type.
150
+ * @typeParam K - Keys to pick.
151
+ * @param obj - The source object.
152
+ * @param keys - Array of keys to include.
153
+ * @returns A new object with only the picked keys.
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * const user = { id: 1, name: "Alice", email: "a@b.com" };
158
+ * usePick(user, ["id", "name"]); // { id: 1, name: "Alice" }
159
+ * ```
68
160
  */
69
- export class SystemUtils {
70
- static instance;
71
- constructor() { }
72
- static getInstance() {
73
- if (!SystemUtils.instance) {
74
- SystemUtils.instance = new SystemUtils();
161
+ export function usePick(obj, keys) {
162
+ return keys.reduce((acc, key) => {
163
+ if (key in obj)
164
+ acc[key] = obj[key];
165
+ return acc;
166
+ }, {});
167
+ }
168
+ /**
169
+ * Omits the listed keys from an object, returning a shallow copy without
170
+ * them. Shallow on purpose to avoid `structuredClone` failures on
171
+ * non-cloneable values.
172
+ *
173
+ * @typeParam T - Source object type.
174
+ * @typeParam K - Keys to omit.
175
+ * @param obj - The source object.
176
+ * @param keys - Array of keys to exclude.
177
+ * @returns A new object without the omitted keys.
178
+ *
179
+ * @example
180
+ * ```ts
181
+ * const user = { id: 1, name: "Alice", password: "secret" };
182
+ * useOmit(user, ["password"]); // { id: 1, name: "Alice" }
183
+ * ```
184
+ */
185
+ export function useOmit(obj, keys) {
186
+ const omit = new Set(keys);
187
+ const result = {};
188
+ for (const key of Object.keys(obj)) {
189
+ if (!omit.has(key)) {
190
+ result[key] = obj[key];
75
191
  }
76
- return SystemUtils.instance;
77
192
  }
78
- useSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
79
- useRetry = async (fn, retries = 3, delayMs = 1000) => {
80
- try {
81
- return await fn();
82
- }
83
- catch (error) {
84
- if (retries <= 0)
85
- throw error;
86
- await this.useSleep(delayMs);
87
- return this.useRetry(fn, retries - 1, delayMs);
88
- }
89
- };
90
- useCopyToClipboard = async (text) => {
91
- try {
92
- await navigator.clipboard.writeText(text);
93
- return true;
94
- }
95
- catch {
96
- return false;
97
- }
98
- };
99
- useGetUrlParams = (urlString) => {
100
- try {
101
- const url = new URL(urlString);
102
- return Object.fromEntries(url.searchParams.entries());
103
- }
104
- catch {
105
- return {};
106
- }
107
- };
108
- useRound = (value, decimals = 2) => {
109
- const num = typeof value === "string" ? Number.parseFloat(value) : value;
110
- if (Number.isNaN(num))
111
- return 0;
112
- const factor = 10 ** decimals;
113
- return Math.round(num * factor) / factor;
114
- };
115
- useAverage = (numbers) => {
116
- if (numbers.length === 0)
117
- return 0;
118
- const sum = numbers.reduce((acc, n) => acc + n, 0);
119
- return sum / numbers.length;
120
- };
193
+ return result;
194
+ }
195
+ /**
196
+ * Returns a promise that resolves after `ms` milliseconds.
197
+ *
198
+ * @param ms - Delay in milliseconds.
199
+ * @returns A promise that resolves after the delay.
200
+ *
201
+ * @example
202
+ * ```ts
203
+ * await useSleep(1000); // waits 1 second
204
+ * console.log("done");
205
+ * ```
206
+ */
207
+ export function useSleep(ms) {
208
+ return new Promise((resolve) => setTimeout(resolve, ms));
121
209
  }
122
210
  /**
123
- * Main facade composing data and system utilities.
211
+ * Retries an async function with a fixed delay between attempts.
212
+ *
213
+ * @typeParam T - The resolved value type.
214
+ * @param fn - The async function to retry.
215
+ * @param retries - Maximum number of retries (defaults to `3`).
216
+ * @param delayMs - Delay between retries in milliseconds (defaults to `1000`).
217
+ * @returns The resolved value of `fn`.
218
+ * @throws The last error if all retries are exhausted.
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * const data = await useRetry(() => fetch("/api").then(r => r.json()), 3, 500);
223
+ * ```
124
224
  */
125
- export class AppUtils {
126
- static instance;
127
- data;
128
- system;
129
- constructor() {
130
- this.data = DataUtils.getInstance();
131
- this.system = SystemUtils.getInstance();
225
+ export async function useRetry(fn, retries = 3, delayMs = 1000) {
226
+ try {
227
+ return await fn();
132
228
  }
133
- static getInstance() {
134
- if (!AppUtils.instance) {
135
- AppUtils.instance = new AppUtils();
136
- }
137
- return AppUtils.instance;
229
+ catch (error) {
230
+ if (retries <= 0)
231
+ throw error;
232
+ await useSleep(delayMs);
233
+ return useRetry(fn, retries - 1, delayMs);
234
+ }
235
+ }
236
+ /**
237
+ * Copies text to the clipboard (browser only). Returns `false` on failure
238
+ * or in non-browser environments (SSR).
239
+ *
240
+ * @param text - The text to copy.
241
+ * @returns `true` if the text was copied, `false` otherwise.
242
+ *
243
+ * @example
244
+ * ```ts
245
+ * const ok = await useCopyToClipboard("Hello, world!");
246
+ * console.log(ok); // true (in a browser with clipboard API)
247
+ * ```
248
+ */
249
+ export async function useCopyToClipboard(text) {
250
+ try {
251
+ await navigator.clipboard.writeText(text);
252
+ return true;
253
+ }
254
+ catch {
255
+ return false;
138
256
  }
139
257
  }
140
- // Singleton instances and destructured exports.
141
- export const { useUnique, useChunk, useGroupBy, useIsObject, useDeepClone, useDeepMerge, usePick, useOmit, } = DataUtils.getInstance();
142
- export const { useSleep, useRetry, useCopyToClipboard, useGetUrlParams, useRound, useAverage, } = SystemUtils.getInstance();
258
+ /**
259
+ * Parses query parameters from a URL string into a plain object.
260
+ * Returns an empty object for invalid URLs.
261
+ *
262
+ * @param urlString - The URL to parse.
263
+ * @returns An object mapping parameter names to values.
264
+ *
265
+ * @example
266
+ * ```ts
267
+ * useGetUrlParams("https://example.com?q=hello&page=1");
268
+ * // { q: "hello", page: "1" }
269
+ *
270
+ * useGetUrlParams("not-a-url"); // {}
271
+ * ```
272
+ */
273
+ export function useGetUrlParams(urlString) {
274
+ try {
275
+ const url = new URL(urlString);
276
+ return Object.fromEntries(url.searchParams.entries());
277
+ }
278
+ catch {
279
+ return {};
280
+ }
281
+ }
282
+ /**
283
+ * Rounds a number (or numeric string) to the specified number of decimal
284
+ * places. Returns `0` for non-numeric input.
285
+ *
286
+ * @param value - The number or numeric string to round.
287
+ * @param decimals - Number of decimal places (defaults to `2`).
288
+ * @returns The rounded number.
289
+ *
290
+ * @example
291
+ * ```ts
292
+ * useRound(3.14159, 2); // 3.14
293
+ * useRound("5.678", 1); // 5.7
294
+ * useRound("not-a-num"); // 0
295
+ * ```
296
+ */
297
+ export function useRound(value, decimals = 2) {
298
+ const num = typeof value === "string" ? Number.parseFloat(value) : value;
299
+ if (Number.isNaN(num))
300
+ return 0;
301
+ const factor = 10 ** decimals;
302
+ return Math.round(num * factor) / factor;
303
+ }
304
+ /**
305
+ * Computes the arithmetic mean of an array of numbers. Returns `0` for an
306
+ * empty array.
307
+ *
308
+ * @param numbers - The input numbers.
309
+ * @returns The arithmetic mean.
310
+ *
311
+ * @example
312
+ * ```ts
313
+ * useAverage([1, 2, 3, 4, 5]); // 3
314
+ * useAverage([]); // 0
315
+ * ```
316
+ */
317
+ export function useAverage(numbers) {
318
+ if (numbers.length === 0)
319
+ return 0;
320
+ const sum = numbers.reduce((acc, n) => acc + n, 0);
321
+ return sum / numbers.length;
322
+ }
143
323
  //# sourceMappingURL=utils.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.service.js","sourceRoot":"","sources":["../../../src/core/services/utils.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.service.js","sourceRoot":"","sources":["../../../src/core/services/utils.service.ts"],"names":[],"mappings":"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"}