@vpmedia/simplify 1.74.0 → 1.75.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 (217) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/const/http_status.d.ts +66 -0
  3. package/dist/const/http_status.d.ts.map +1 -0
  4. package/dist/const/http_status.js +133 -0
  5. package/dist/const/http_status.js.map +1 -0
  6. package/dist/index.d.ts +34 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/{src → dist}/index.js +3 -20
  9. package/dist/index.js.map +1 -0
  10. package/dist/logging/AbstractLogHandler.d.ts +17 -0
  11. package/dist/logging/AbstractLogHandler.d.ts.map +1 -0
  12. package/dist/logging/AbstractLogHandler.js +16 -0
  13. package/dist/logging/AbstractLogHandler.js.map +1 -0
  14. package/dist/logging/ConsoleLogHandler.d.ts +13 -0
  15. package/dist/logging/ConsoleLogHandler.d.ts.map +1 -0
  16. package/dist/logging/ConsoleLogHandler.js +41 -0
  17. package/dist/logging/ConsoleLogHandler.js.map +1 -0
  18. package/dist/logging/Logger.d.ts +19 -0
  19. package/dist/logging/Logger.d.ts.map +1 -0
  20. package/dist/logging/Logger.js +51 -0
  21. package/dist/logging/Logger.js.map +1 -0
  22. package/dist/logging/OpenTelemetryLogHandler.d.ts +15 -0
  23. package/dist/logging/OpenTelemetryLogHandler.d.ts.map +1 -0
  24. package/dist/logging/OpenTelemetryLogHandler.js +21 -0
  25. package/dist/logging/OpenTelemetryLogHandler.js.map +1 -0
  26. package/dist/logging/SentryLogHandler.d.ts +13 -0
  27. package/dist/logging/SentryLogHandler.d.ts.map +1 -0
  28. package/dist/logging/SentryLogHandler.js +36 -0
  29. package/dist/logging/SentryLogHandler.js.map +1 -0
  30. package/dist/logging/const.d.ts +14 -0
  31. package/dist/logging/const.d.ts.map +1 -0
  32. package/dist/logging/const.js +21 -0
  33. package/dist/logging/const.js.map +1 -0
  34. package/dist/logging/util.d.ts +14 -0
  35. package/dist/logging/util.d.ts.map +1 -0
  36. package/dist/logging/util.js +34 -0
  37. package/dist/logging/util.js.map +1 -0
  38. package/dist/pagelifecycle/const.d.ts +15 -0
  39. package/dist/pagelifecycle/const.d.ts.map +1 -0
  40. package/dist/pagelifecycle/const.js +27 -0
  41. package/dist/pagelifecycle/const.js.map +1 -0
  42. package/dist/pagelifecycle/typedef.d.ts +4 -0
  43. package/dist/pagelifecycle/typedef.d.ts.map +1 -0
  44. package/dist/pagelifecycle/typedef.js +2 -0
  45. package/dist/pagelifecycle/typedef.js.map +1 -0
  46. package/dist/pagelifecycle/util.d.ts +31 -0
  47. package/dist/pagelifecycle/util.d.ts.map +1 -0
  48. package/dist/pagelifecycle/util.js +117 -0
  49. package/dist/pagelifecycle/util.js.map +1 -0
  50. package/dist/typecheck/TypeCheckError.d.ts +11 -0
  51. package/dist/typecheck/TypeCheckError.d.ts.map +1 -0
  52. package/dist/typecheck/TypeCheckError.js +12 -0
  53. package/dist/typecheck/TypeCheckError.js.map +1 -0
  54. package/dist/typecheck/TypeChecker.d.ts +27 -0
  55. package/dist/typecheck/TypeChecker.d.ts.map +1 -0
  56. package/dist/typecheck/TypeChecker.js +69 -0
  57. package/dist/typecheck/TypeChecker.js.map +1 -0
  58. package/dist/typecheck/util.d.ts +17 -0
  59. package/dist/typecheck/util.d.ts.map +1 -0
  60. package/dist/typecheck/util.js +42 -0
  61. package/dist/typecheck/util.js.map +1 -0
  62. package/dist/util/async.d.ts +13 -0
  63. package/dist/util/async.d.ts.map +1 -0
  64. package/dist/util/async.js +39 -0
  65. package/dist/util/async.js.map +1 -0
  66. package/dist/util/error.d.ts +16 -0
  67. package/dist/util/error.d.ts.map +1 -0
  68. package/dist/util/error.js +27 -0
  69. package/dist/util/error.js.map +1 -0
  70. package/dist/util/event_emitter.d.ts +42 -0
  71. package/dist/util/event_emitter.d.ts.map +1 -0
  72. package/dist/util/event_emitter.js +127 -0
  73. package/dist/util/event_emitter.js.map +1 -0
  74. package/dist/util/fetch.d.ts +22 -0
  75. package/dist/util/fetch.d.ts.map +1 -0
  76. package/dist/util/fetch.js +75 -0
  77. package/dist/util/fetch.js.map +1 -0
  78. package/dist/util/number.d.ts +23 -0
  79. package/dist/util/number.d.ts.map +1 -0
  80. package/dist/util/number.js +52 -0
  81. package/dist/util/number.js.map +1 -0
  82. package/dist/util/object.d.ts +24 -0
  83. package/dist/util/object.d.ts.map +1 -0
  84. package/dist/util/object.js +83 -0
  85. package/dist/util/object.js.map +1 -0
  86. package/dist/util/query.d.ts +11 -0
  87. package/dist/util/query.d.ts.map +1 -0
  88. package/dist/util/query.js +24 -0
  89. package/dist/util/query.js.map +1 -0
  90. package/dist/util/state.d.ts +5 -0
  91. package/dist/util/state.d.ts.map +1 -0
  92. package/dist/util/state.js +19 -0
  93. package/dist/util/state.js.map +1 -0
  94. package/dist/util/string.d.ts +25 -0
  95. package/dist/util/string.d.ts.map +1 -0
  96. package/dist/util/string.js +59 -0
  97. package/dist/util/string.js.map +1 -0
  98. package/dist/util/uuid.d.ts +13 -0
  99. package/dist/util/uuid.d.ts.map +1 -0
  100. package/dist/util/uuid.js +27 -0
  101. package/dist/util/uuid.js.map +1 -0
  102. package/dist/util/validate.d.ts +106 -0
  103. package/dist/util/validate.d.ts.map +1 -0
  104. package/dist/util/validate.js +139 -0
  105. package/dist/util/validate.js.map +1 -0
  106. package/package.json +31 -16
  107. package/src/const/http_status.test.ts +7 -0
  108. package/src/const/{http_status.js → http_status.ts} +1 -1
  109. package/src/index.ts +51 -0
  110. package/src/logging/AbstractLogHandler.ts +31 -0
  111. package/src/logging/{ConsoleLogHandler.js → ConsoleLogHandler.ts} +15 -13
  112. package/src/logging/Logger.test.ts +69 -0
  113. package/src/logging/Logger.ts +77 -0
  114. package/src/logging/OpenTelemetryLogHandler.ts +40 -0
  115. package/src/logging/SentryLogHandler.ts +44 -0
  116. package/src/logging/{const.js → const.ts} +1 -1
  117. package/src/logging/util.test.ts +33 -0
  118. package/src/logging/util.ts +36 -0
  119. package/src/pagelifecycle/{const.js → const.ts} +2 -2
  120. package/src/pagelifecycle/typedef.ts +5 -0
  121. package/src/pagelifecycle/util.test.ts +99 -0
  122. package/src/pagelifecycle/{util.js → util.ts} +14 -27
  123. package/src/typecheck/{TypeCheckError.js → TypeCheckError.ts} +7 -3
  124. package/src/typecheck/TypeChecker.test.ts +70 -0
  125. package/src/typecheck/{TypeChecker.js → TypeChecker.ts} +10 -27
  126. package/src/typecheck/util.test.ts +36 -0
  127. package/src/typecheck/util.ts +50 -0
  128. package/src/util/async.test.ts +74 -0
  129. package/src/util/{async.js → async.ts} +3 -12
  130. package/src/util/error.test.ts +32 -0
  131. package/src/util/error.ts +37 -0
  132. package/src/util/event_emitter.test.ts +228 -0
  133. package/src/util/event_emitter.ts +147 -0
  134. package/src/util/fetch.test.ts +62 -0
  135. package/src/util/{fetch.js → fetch.ts} +40 -31
  136. package/src/util/number.test.ts +124 -0
  137. package/src/util/number.ts +58 -0
  138. package/src/util/object.test.ts +203 -0
  139. package/src/util/{object.js → object.ts} +14 -21
  140. package/src/util/query.test.ts +71 -0
  141. package/src/util/query.ts +35 -0
  142. package/src/util/state.test.ts +47 -0
  143. package/src/util/{state.js → state.ts} +3 -6
  144. package/src/util/string.test.ts +64 -0
  145. package/src/util/string.ts +65 -0
  146. package/src/util/uuid.test.ts +53 -0
  147. package/src/util/uuid.ts +31 -0
  148. package/src/util/validate.test.ts +309 -0
  149. package/src/util/validate.ts +230 -0
  150. package/.vscode/extensions.json +0 -6
  151. package/.vscode/settings.json +0 -27
  152. package/src/logging/AbstractLogHandler.js +0 -23
  153. package/src/logging/Logger.js +0 -115
  154. package/src/logging/OpenTelemetryLogHandler.js +0 -30
  155. package/src/logging/SentryLogHandler.js +0 -46
  156. package/src/logging/util.js +0 -41
  157. package/src/pagelifecycle/typedef.js +0 -9
  158. package/src/typecheck/util.js +0 -60
  159. package/src/util/error.js +0 -33
  160. package/src/util/event_emitter.js +0 -196
  161. package/src/util/number.js +0 -118
  162. package/src/util/query.js +0 -32
  163. package/src/util/string.js +0 -76
  164. package/src/util/uuid.js +0 -35
  165. package/src/util/validate.js +0 -247
  166. package/types/const/http_status.d.ts +0 -131
  167. package/types/const/http_status.d.ts.map +0 -1
  168. package/types/index.d.ts +0 -26
  169. package/types/index.d.ts.map +0 -1
  170. package/types/logging/AbstractLogHandler.d.ts +0 -20
  171. package/types/logging/AbstractLogHandler.d.ts.map +0 -1
  172. package/types/logging/ConsoleLogHandler.d.ts +0 -9
  173. package/types/logging/ConsoleLogHandler.d.ts.map +0 -1
  174. package/types/logging/Logger.d.ts +0 -66
  175. package/types/logging/Logger.d.ts.map +0 -1
  176. package/types/logging/OpenTelemetryLogHandler.d.ts +0 -11
  177. package/types/logging/OpenTelemetryLogHandler.d.ts.map +0 -1
  178. package/types/logging/SentryLogHandler.d.ts +0 -9
  179. package/types/logging/SentryLogHandler.d.ts.map +0 -1
  180. package/types/logging/const.d.ts +0 -14
  181. package/types/logging/const.d.ts.map +0 -1
  182. package/types/logging/util.d.ts +0 -4
  183. package/types/logging/util.d.ts.map +0 -1
  184. package/types/pagelifecycle/const.d.ts +0 -15
  185. package/types/pagelifecycle/const.d.ts.map +0 -1
  186. package/types/pagelifecycle/typedef.d.ts +0 -4
  187. package/types/pagelifecycle/typedef.d.ts.map +0 -1
  188. package/types/pagelifecycle/util.d.ts +0 -8
  189. package/types/pagelifecycle/util.d.ts.map +0 -1
  190. package/types/typecheck/TypeCheckError.d.ts +0 -13
  191. package/types/typecheck/TypeCheckError.d.ts.map +0 -1
  192. package/types/typecheck/TypeChecker.d.ts +0 -40
  193. package/types/typecheck/TypeChecker.d.ts.map +0 -1
  194. package/types/typecheck/util.d.ts +0 -4
  195. package/types/typecheck/util.d.ts.map +0 -1
  196. package/types/util/async.d.ts +0 -4
  197. package/types/util/async.d.ts.map +0 -1
  198. package/types/util/error.d.ts +0 -3
  199. package/types/util/error.d.ts.map +0 -1
  200. package/types/util/event_emitter.d.ts +0 -69
  201. package/types/util/event_emitter.d.ts.map +0 -1
  202. package/types/util/fetch.d.ts +0 -22
  203. package/types/util/fetch.d.ts.map +0 -1
  204. package/types/util/number.d.ts +0 -11
  205. package/types/util/number.d.ts.map +0 -1
  206. package/types/util/object.d.ts +0 -6
  207. package/types/util/object.d.ts.map +0 -1
  208. package/types/util/query.d.ts +0 -3
  209. package/types/util/query.d.ts.map +0 -1
  210. package/types/util/state.d.ts +0 -2
  211. package/types/util/state.d.ts.map +0 -1
  212. package/types/util/string.d.ts +0 -7
  213. package/types/util/string.d.ts.map +0 -1
  214. package/types/util/uuid.d.ts +0 -4
  215. package/types/util/uuid.d.ts.map +0 -1
  216. package/types/util/validate.d.ts +0 -45
  217. package/types/util/validate.d.ts.map +0 -1
@@ -0,0 +1,39 @@
1
+ import { getTypedError } from './error.js';
2
+ /**
3
+ * Returns a promise with delayed resolve.
4
+ */
5
+ export const delayPromise = (delayMS) => new Promise((resolve) => {
6
+ setTimeout(resolve, delayMS);
7
+ });
8
+ /**
9
+ * Async method call retry helper.
10
+ */
11
+ export const retryAsync = async (method, numTries = 1, delayMs = 100) => {
12
+ for (let attempt = 0; attempt <= numTries; attempt += 1) {
13
+ try {
14
+ // oxlint-disable-next-line no-await-in-loop
15
+ return await method();
16
+ }
17
+ catch (error) {
18
+ if (attempt === numTries) {
19
+ throw getTypedError(error);
20
+ }
21
+ if (delayMs > 0) {
22
+ // oxlint-disable-next-line no-await-in-loop
23
+ await delayPromise(delayMs);
24
+ }
25
+ }
26
+ }
27
+ throw new Error('Unknown error');
28
+ };
29
+ /**
30
+ * Load JSON file using a fetch GET request.
31
+ */
32
+ export const loadJSON = async (url) => {
33
+ const response = await fetch(url);
34
+ if (!response.ok) {
35
+ throw new DOMException(`Fetch error ${response.status}`, 'FetchError');
36
+ }
37
+ return response.json();
38
+ };
39
+ //# sourceMappingURL=async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/util/async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAiB,EAAE,CAC7D,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAK,MAAwB,EAAE,QAAQ,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,EAAc,EAAE;IACvG,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,4CAA4C;YAC5C,OAAO,MAAM,MAAM,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzB,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,4CAA4C;gBAC5C,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAoB,EAAE;IAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,YAAY,CAAC,eAAe,QAAQ,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ErrorDetails {
2
+ name: string;
3
+ type: string;
4
+ message?: string;
5
+ cause?: unknown;
6
+ [key: string]: unknown;
7
+ }
8
+ /**
9
+ * Retrieves detailed information from an error object.
10
+ */
11
+ export declare const getErrorDetails: (error: Error, excludes?: string[] | null) => ErrorDetails;
12
+ /**
13
+ * Get typed error from an unknown type.
14
+ */
15
+ export declare const getTypedError: (error: unknown) => Error;
16
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/util/error.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,EAAE,WAAW,MAAM,EAAE,GAAG,IAAI,KAAG,YAiB1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KACY,CAAC"}
@@ -0,0 +1,27 @@
1
+ const DEFAULT_EXCLUDES = new Set(['stack']);
2
+ /**
3
+ * Retrieves detailed information from an error object.
4
+ */
5
+ export const getErrorDetails = (error, excludes) => {
6
+ const errorDetails = {
7
+ name: error.name,
8
+ type: error.constructor?.name ?? typeof error,
9
+ };
10
+ if (error.message) {
11
+ errorDetails.message = error.message;
12
+ }
13
+ if (error.cause) {
14
+ errorDetails.cause = error.cause;
15
+ }
16
+ for (const key of Object.getOwnPropertyNames(error)) {
17
+ if (!excludes?.includes(key) && !DEFAULT_EXCLUDES.has(key)) {
18
+ errorDetails[key] = error[key];
19
+ }
20
+ }
21
+ return errorDetails;
22
+ };
23
+ /**
24
+ * Get typed error from an unknown type.
25
+ */
26
+ export const getTypedError = (error) => error instanceof Error ? error : new Error(String(error));
27
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/util/error.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAU5C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAY,EAAE,QAA0B,EAAgB,EAAE;IACxF,MAAM,YAAY,GAAiB;QACjC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,OAAO,KAAK;KAC9C,CAAC;IACF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACnC,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3D,YAAY,CAAC,GAAG,CAAC,GAAI,KAA4C,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAS,EAAE,CACrD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ export type EventListener = (...args: any[]) => void;
2
+ /**
3
+ * Event emitter implementation inspired by Node.js/EventEmitter3.
4
+ */
5
+ export declare class EventEmitter {
6
+ #private;
7
+ constructor();
8
+ /**
9
+ * Get all registered event names.
10
+ */
11
+ eventNames(): (string | symbol)[];
12
+ /**
13
+ * Get all listener functions registered for an event.
14
+ */
15
+ listeners(event: string | symbol): EventListener[];
16
+ /**
17
+ * Get the number of listeners registered for an event.
18
+ */
19
+ listenerCount(event: string | symbol): number;
20
+ /**
21
+ * Emit an event, invoking all registered listeners.
22
+ */
23
+ emit(event: string | symbol, ...args: unknown[]): boolean;
24
+ /**
25
+ * Register a persistent listener for an event.
26
+ */
27
+ on(event: string | symbol, fn: EventListener, context?: unknown): this;
28
+ /**
29
+ * Register a one-time listener for an event.
30
+ */
31
+ once(event: string | symbol, fn: EventListener, context?: unknown): this;
32
+ /**
33
+ * Remove a specific listener, or all listeners for an event.
34
+ */
35
+ off(event: string | symbol, fn?: EventListener, context?: unknown): this;
36
+ /**
37
+ * Remove all listeners from the emitter,
38
+ * or all listeners for a specific event.
39
+ */
40
+ removeAllListeners(event?: string | symbol): this;
41
+ }
42
+ //# sourceMappingURL=event_emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event_emitter.d.ts","sourceRoot":"","sources":["../../src/util/event_emitter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAkBrD;;GAEG;AACH,qBAAa,YAAY;;;IAOvB;;OAEG;IACH,UAAU,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE;IAIjC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,EAAE;IAKlD;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAK7C;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO;IAiCzD;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAItE;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAIxE;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IA6BxE;;;OAGG;IACH,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CASlD"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Internal listener wrapper that stores metadata
3
+ * about a registered event listener.
4
+ */
5
+ class Listener {
6
+ fn;
7
+ context;
8
+ once;
9
+ constructor(fn, context, once = false) {
10
+ this.fn = fn;
11
+ this.context = context;
12
+ this.once = once;
13
+ }
14
+ }
15
+ /**
16
+ * Event emitter implementation inspired by Node.js/EventEmitter3.
17
+ */
18
+ export class EventEmitter {
19
+ #events;
20
+ constructor() {
21
+ this.#events = new Map();
22
+ }
23
+ /**
24
+ * Get all registered event names.
25
+ */
26
+ eventNames() {
27
+ return [...this.#events.keys()];
28
+ }
29
+ /**
30
+ * Get all listener functions registered for an event.
31
+ */
32
+ listeners(event) {
33
+ const listeners = this.#events.get(event);
34
+ return listeners ? listeners.map((l) => l.fn) : [];
35
+ }
36
+ /**
37
+ * Get the number of listeners registered for an event.
38
+ */
39
+ listenerCount(event) {
40
+ const listeners = this.#events.get(event);
41
+ return listeners ? listeners.length : 0;
42
+ }
43
+ /**
44
+ * Emit an event, invoking all registered listeners.
45
+ */
46
+ emit(event, ...args) {
47
+ const listeners = this.#events.get(event);
48
+ if (!listeners || listeners.length === 0) {
49
+ return false;
50
+ }
51
+ for (const listener of [...listeners]) {
52
+ listener.fn.apply(listener.context, args);
53
+ if (listener.once) {
54
+ this.off(event, listener.fn, listener.context);
55
+ }
56
+ }
57
+ return true;
58
+ }
59
+ #addListener(event, fn, context, once) {
60
+ if (typeof fn !== 'function') {
61
+ throw new TypeError('Listener must be a function');
62
+ }
63
+ const listener = new Listener(fn, context ?? this, once);
64
+ const listeners = this.#events.get(event);
65
+ if (listeners) {
66
+ listeners.push(listener);
67
+ }
68
+ else {
69
+ this.#events.set(event, [listener]);
70
+ }
71
+ return this;
72
+ }
73
+ /**
74
+ * Register a persistent listener for an event.
75
+ */
76
+ on(event, fn, context) {
77
+ return this.#addListener(event, fn, context, false);
78
+ }
79
+ /**
80
+ * Register a one-time listener for an event.
81
+ */
82
+ once(event, fn, context) {
83
+ return this.#addListener(event, fn, context, true);
84
+ }
85
+ /**
86
+ * Remove a specific listener, or all listeners for an event.
87
+ */
88
+ off(event, fn, context) {
89
+ if (!this.#events.has(event)) {
90
+ return this;
91
+ }
92
+ if (!fn) {
93
+ this.#events.delete(event);
94
+ return this;
95
+ }
96
+ const filtered = this.#events.get(event).filter((listener) => {
97
+ if (listener.fn !== fn) {
98
+ return true;
99
+ }
100
+ if (context !== undefined && listener.context !== context) {
101
+ return true;
102
+ }
103
+ return false;
104
+ });
105
+ if (filtered.length > 0) {
106
+ this.#events.set(event, filtered);
107
+ }
108
+ else {
109
+ this.#events.delete(event);
110
+ }
111
+ return this;
112
+ }
113
+ /**
114
+ * Remove all listeners from the emitter,
115
+ * or all listeners for a specific event.
116
+ */
117
+ removeAllListeners(event) {
118
+ if (event === undefined) {
119
+ this.#events.clear();
120
+ }
121
+ else {
122
+ this.#events.delete(event);
123
+ }
124
+ return this;
125
+ }
126
+ }
127
+ //# sourceMappingURL=event_emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event_emitter.js","sourceRoot":"","sources":["../../src/util/event_emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare const HTTP_0_ANY = 0;
2
+ export interface FetchRetryOptions {
3
+ delay?: number;
4
+ numTries?: number;
5
+ statusExcludes?: number[];
6
+ timeout?: number;
7
+ }
8
+ export declare class FetchError extends Error {
9
+ resource: string | URL | Request;
10
+ fetchOptions: RequestInit;
11
+ response: Response | null;
12
+ cause: number | null;
13
+ /**
14
+ * Creates a new FetchError instance.
15
+ */
16
+ constructor(message: string, resource: string | URL | Request, fetchOptions: RequestInit, response: Response | null);
17
+ }
18
+ /**
19
+ * Fetch with retry.
20
+ */
21
+ export declare const fetchRetry: (resource: string | URL | Request, fetchOptions: RequestInit, retryOptions?: FetchRetryOptions) => Promise<Response>;
22
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/util/fetch.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC;IACjC,YAAY,EAAE,WAAW,CAAC;IAC1B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;OAEG;gBACS,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAQpH;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,GAAG,GAAG,GAAG,OAAO,EAChC,cAAc,WAAW,EACzB,eAAe,iBAAiB,KAC/B,OAAO,CAAC,QAAQ,CAkDlB,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN, HTTP_405_METHOD_NOT_ALLOWED, HTTP_422_UNPROCESSABLE_CONTENT, } from '../const/http_status.js';
2
+ import { Logger } from '../logging/Logger.js';
3
+ import { delayPromise } from './async.js';
4
+ import { getErrorDetails } from './error.js';
5
+ const logger = new Logger('fetch');
6
+ export const HTTP_0_ANY = 0;
7
+ export class FetchError extends Error {
8
+ resource;
9
+ fetchOptions;
10
+ response;
11
+ cause;
12
+ /**
13
+ * Creates a new FetchError instance.
14
+ */
15
+ constructor(message, resource, fetchOptions, response) {
16
+ super(message);
17
+ this.name = 'FetchError';
18
+ this.resource = resource;
19
+ this.fetchOptions = fetchOptions;
20
+ this.response = response;
21
+ this.cause = response?.status ?? null;
22
+ }
23
+ }
24
+ /**
25
+ * Fetch with retry.
26
+ */
27
+ export const fetchRetry = async (resource, fetchOptions, retryOptions) => {
28
+ const opts = {
29
+ timeout: Math.max(retryOptions?.timeout ?? 30_000, 1),
30
+ delay: Math.max(retryOptions?.delay ?? 1000, 1),
31
+ numTries: Math.max(retryOptions?.numTries ?? 1, 1),
32
+ statusExcludes: retryOptions?.statusExcludes ?? [
33
+ HTTP_401_UNAUTHORIZED,
34
+ HTTP_403_FORBIDDEN,
35
+ HTTP_405_METHOD_NOT_ALLOWED,
36
+ HTTP_422_UNPROCESSABLE_CONTENT,
37
+ ],
38
+ };
39
+ while (opts.numTries > 0) {
40
+ const isOnline = globalThis.navigator?.onLine;
41
+ logger.info('request', { resource: String(resource), fetchOptions, retryOptions: { ...opts }, isOnline });
42
+ const controller = new AbortController();
43
+ const timeoutId = setTimeout(() => controller.abort(new DOMException('Fetch timed out', 'AbortError')), opts.timeout);
44
+ const options = {
45
+ ...fetchOptions,
46
+ signal: controller.signal,
47
+ };
48
+ try {
49
+ const response = await fetch(resource, options);
50
+ if (!response.ok) {
51
+ throw new FetchError(`Fetch error ${response.status}`, resource, options, response);
52
+ }
53
+ logger.info('response', { status: response.status });
54
+ return response;
55
+ }
56
+ catch (error) {
57
+ const typedError = error instanceof Error ? error : new Error(String(error));
58
+ logger.debug('error', getErrorDetails(typedError));
59
+ opts.numTries -= 1;
60
+ if (opts.numTries === 0 ||
61
+ (typedError instanceof FetchError &&
62
+ (opts.statusExcludes.includes(typedError.response?.status ?? -1) ||
63
+ opts.statusExcludes.includes(HTTP_0_ANY)))) {
64
+ throw error;
65
+ }
66
+ await delayPromise(opts.delay);
67
+ opts.delay *= 2;
68
+ }
69
+ finally {
70
+ clearTimeout(timeoutId);
71
+ }
72
+ }
73
+ throw new Error('Fetch failed');
74
+ };
75
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/util/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Converts degrees to radians.
3
+ */
4
+ export declare const deg2rad: (degrees: number) => number;
5
+ /**
6
+ * Converts radians to degrees.
7
+ */
8
+ export declare const rad2deg: (radians: number) => number;
9
+ /**
10
+ * Returns random integer in range.
11
+ */
12
+ export declare const getRandomInt: (min: number, max: number) => number;
13
+ /**
14
+ * Normalizes floating point precision (e.g. 0.20000000000000004 → 0.2).
15
+ */
16
+ export declare const fixFloatPrecision: (value: number | string | null | undefined) => number;
17
+ export declare const isGreater: (value: number, min: number) => boolean;
18
+ export declare const isGreaterOrEqual: (value: number, min: number) => boolean;
19
+ export declare const isLess: (value: number, min: number) => boolean;
20
+ export declare const isLessOrEqual: (value: number, min: number) => boolean;
21
+ export declare const isInRange: (value: number, min: number, max: number) => boolean;
22
+ export declare const isEqual: (value: number, expected: number) => boolean;
23
+ //# sourceMappingURL=number.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/util/number.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,MAKzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,MAKzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAQvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAM7E,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,KAAG,OAAsB,CAAC;AAC9E,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,KAAG,OAAuB,CAAC;AACtF,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,KAAG,OAAsB,CAAC;AAC3E,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,KAAG,OAAuB,CAAC;AACnF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,OAAuC,CAAC;AAC5G,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,OAA6B,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { TypeCheckError } from '../typecheck/TypeCheckError.js';
2
+ const DEG_TO_RAD = Math.PI / 180;
3
+ const RAD_TO_DEG = 180 / Math.PI;
4
+ const PRECISION = 12;
5
+ const EPSILON = 1e-11;
6
+ /**
7
+ * Converts degrees to radians.
8
+ */
9
+ export const deg2rad = (degrees) => {
10
+ if (!Number.isFinite(degrees)) {
11
+ throw new TypeCheckError('Argument degrees must be a finite number', { value: degrees });
12
+ }
13
+ return degrees * DEG_TO_RAD;
14
+ };
15
+ /**
16
+ * Converts radians to degrees.
17
+ */
18
+ export const rad2deg = (radians) => {
19
+ if (!Number.isFinite(radians)) {
20
+ throw new TypeCheckError('Argument radians must be a finite number', { value: radians });
21
+ }
22
+ return radians * RAD_TO_DEG;
23
+ };
24
+ /**
25
+ * Returns random integer in range.
26
+ */
27
+ export const getRandomInt = (min, max) => {
28
+ if (!Number.isFinite(min)) {
29
+ throw new TypeCheckError('Argument min must be finite number', { value: min });
30
+ }
31
+ if (!Number.isFinite(max)) {
32
+ throw new TypeCheckError('Argument max must be finite number', { value: max });
33
+ }
34
+ return Math.floor(Math.random() * (max - min + 1)) + min;
35
+ };
36
+ /**
37
+ * Normalizes floating point precision (e.g. 0.20000000000000004 → 0.2).
38
+ */
39
+ export const fixFloatPrecision = (value) => {
40
+ const parsedValue = typeof value === 'string' ? Number(value) : value;
41
+ if (parsedValue === null || parsedValue === undefined || !Number.isFinite(parsedValue)) {
42
+ return Number.NaN;
43
+ }
44
+ return Math.abs(parsedValue) < EPSILON ? 0 : Number(parsedValue.toPrecision(PRECISION));
45
+ };
46
+ export const isGreater = (value, min) => value > min;
47
+ export const isGreaterOrEqual = (value, min) => value >= min;
48
+ export const isLess = (value, min) => value < min;
49
+ export const isLessOrEqual = (value, min) => value <= min;
50
+ export const isInRange = (value, min, max) => value >= min && value <= max;
51
+ export const isEqual = (value, expected) => value === expected;
52
+ //# sourceMappingURL=number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/util/number.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ type AnyRecord = Record<string, any>;
2
+ /**
3
+ * Purges object properties to free up memory.
4
+ */
5
+ export declare const purgeObject: (target: AnyRecord | null | undefined) => void;
6
+ /**
7
+ * Merge two objects.
8
+ */
9
+ export declare const deepMerge: (target: AnyRecord | null, source: AnyRecord | null) => AnyRecord | null;
10
+ /**
11
+ * Returns the sum value of an array of objects field.
12
+ */
13
+ export declare const getObjArrayPropSum: (arr: AnyRecord[], prop: string) => number;
14
+ /**
15
+ * Get object value by path.
16
+ */
17
+ export declare const getObjValueByPath: (obj: AnyRecord | null | undefined, path: string | null | undefined) => unknown;
18
+ /**
19
+ * Set object value by path.
20
+ * @throws {SyntaxError} Error when illegal path value has been provided.
21
+ */
22
+ export declare const setObjValueByPath: (obj: AnyRecord | null | undefined, path: string | null | undefined, value: unknown) => void;
23
+ export {};
24
+ //# sourceMappingURL=object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/util/object.ts"],"names":[],"mappings":"AAEA,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,SAAS,GAAG,IAAI,GAAG,SAAS,KAAG,IAOlE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ,SAAS,GAAG,IAAI,EAAE,QAAQ,SAAS,GAAG,IAAI,KAAG,SAAS,GAAG,IAsB1F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,KAAK,SAAS,EAAE,EAAE,MAAM,MAAM,KAAG,MACY,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,OAatG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,KAAK,SAAS,GAAG,IAAI,GAAG,SAAS,EACjC,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,OAAO,OAAO,KACb,IAiBF,CAAC"}
@@ -0,0 +1,83 @@
1
+ const PROHIBITED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
2
+ /**
3
+ * Purges object properties to free up memory.
4
+ */
5
+ export const purgeObject = (target) => {
6
+ if (!target) {
7
+ return;
8
+ }
9
+ for (const entry of Object.keys(target)) {
10
+ target[entry] = null;
11
+ }
12
+ };
13
+ /**
14
+ * Merge two objects.
15
+ */
16
+ export const deepMerge = (target, source) => {
17
+ if (typeof target !== 'object' || target === null) {
18
+ return source;
19
+ }
20
+ if (typeof source !== 'object' || source === null) {
21
+ return target;
22
+ }
23
+ for (const key of Object.keys(source)) {
24
+ if (PROHIBITED_KEYS.has(key)) {
25
+ throw new SyntaxError(`Security violation error. Cannot use "${key}" as object key.`);
26
+ }
27
+ if (typeof source[key] === 'object' && source[key] !== null) {
28
+ if (!target[key] || typeof target[key] !== 'object') {
29
+ target[key] = {};
30
+ }
31
+ deepMerge(target[key], source[key]);
32
+ }
33
+ else {
34
+ target[key] = source[key];
35
+ }
36
+ }
37
+ return target;
38
+ };
39
+ /**
40
+ * Returns the sum value of an array of objects field.
41
+ */
42
+ export const getObjArrayPropSum = (arr, prop) => arr.reduce((accumulator, object) => accumulator + object[prop], 0);
43
+ /**
44
+ * Get object value by path.
45
+ */
46
+ export const getObjValueByPath = (obj, path) => {
47
+ if (!obj || !path) {
48
+ return null;
49
+ }
50
+ const keyParts = path.split('.');
51
+ const nextKey = keyParts[0];
52
+ if (keyParts.length === 1) {
53
+ return obj[nextKey] === undefined ? null : obj[nextKey];
54
+ }
55
+ if (obj[nextKey] === undefined || obj[nextKey] === null) {
56
+ return null;
57
+ }
58
+ return getObjValueByPath(obj[nextKey], keyParts.slice(1).join('.'));
59
+ };
60
+ /**
61
+ * Set object value by path.
62
+ * @throws {SyntaxError} Error when illegal path value has been provided.
63
+ */
64
+ export const setObjValueByPath = (obj, path, value) => {
65
+ if (!obj || !path) {
66
+ return;
67
+ }
68
+ const keyParts = path.split('.');
69
+ const nextKey = keyParts[0];
70
+ if (PROHIBITED_KEYS.has(nextKey)) {
71
+ throw new SyntaxError(`Security violation error. Cannot use "${nextKey}" as parameter.`);
72
+ }
73
+ if (keyParts.length === 1) {
74
+ obj[nextKey] = value;
75
+ }
76
+ else {
77
+ if (obj[nextKey] === undefined || obj[nextKey] === null) {
78
+ obj[nextKey] = {};
79
+ }
80
+ setObjValueByPath(obj[nextKey], keyParts.slice(1).join('.'), value);
81
+ }
82
+ };
83
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/util/object.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Sanitizes URL parameters allowing only alpha-numeric characters and dash.
3
+ */
4
+ export declare function sanitizeURLParam(input: string): string;
5
+ export declare function sanitizeURLParam(input: null | undefined): null | undefined;
6
+ export declare function sanitizeURLParam(input: string | null | undefined): string | null | undefined;
7
+ /**
8
+ * Get a URL parameter value.
9
+ */
10
+ export declare function getURLParam<T = null>(key: string | null | undefined, defaultValue?: T, isSanitize?: boolean): string | T;
11
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/util/query.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;AAC5E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAQ9F;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,IAAI,EAClC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9B,YAAY,CAAC,EAAE,CAAC,EAChB,UAAU,CAAC,EAAE,OAAO,GACnB,MAAM,GAAG,CAAC,CAYZ"}
@@ -0,0 +1,24 @@
1
+ const urlSearchParams = new URLSearchParams(globalThis.location?.search);
2
+ export function sanitizeURLParam(input) {
3
+ if (!input) {
4
+ return input;
5
+ }
6
+ return input.replaceAll(/[^\w-]/giu, '');
7
+ }
8
+ /**
9
+ * Get a URL parameter value.
10
+ */
11
+ export function getURLParam(key, defaultValue, isSanitize) {
12
+ if (!key) {
13
+ return (defaultValue ?? null);
14
+ }
15
+ const paramValue = urlSearchParams.get(key);
16
+ if (paramValue === null || paramValue === undefined) {
17
+ return (defaultValue ?? null);
18
+ }
19
+ if (isSanitize !== false) {
20
+ return sanitizeURLParam(paramValue);
21
+ }
22
+ return paramValue;
23
+ }
24
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/util/query.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAQzE,MAAM,UAAU,gBAAgB,CAAC,KAAgC;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,GAA8B,EAC9B,YAAgB,EAChB,UAAoB;IAEpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,YAAY,IAAI,IAAI,CAAM,CAAC;IACrC,CAAC;IACD,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACpD,OAAO,CAAC,YAAY,IAAI,IAAI,CAAM,CAAC;IACrC,CAAC;IACD,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,gBAAgB,CAAC,UAAU,CAAW,CAAC;IAChD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Maps server data to client data.
3
+ */
4
+ export declare const serverDataToState: (data: unknown, isRecursive?: boolean) => any;
5
+ //# sourceMappingURL=state.d.ts.map