joopjs 2.0.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 (259) hide show
  1. package/CHANGELOG.md +678 -0
  2. package/README.md +583 -0
  3. package/dist/a11y.service-C-DQQfgO.d.mts +143 -0
  4. package/dist/a11y.service-CauEJrJe.d.ts +143 -0
  5. package/dist/adapters-B6slG6hQ.d.mts +84 -0
  6. package/dist/adapters-B6slG6hQ.d.ts +84 -0
  7. package/dist/aes.service-CkoupAww.d.mts +95 -0
  8. package/dist/aes.service-CkoupAww.d.ts +95 -0
  9. package/dist/ai/index.d.mts +99 -0
  10. package/dist/ai/index.d.ts +99 -0
  11. package/dist/ai/index.js +307 -0
  12. package/dist/ai/index.js.map +1 -0
  13. package/dist/ai/index.mjs +304 -0
  14. package/dist/ai/index.mjs.map +1 -0
  15. package/dist/analytics/index.d.mts +42 -0
  16. package/dist/analytics/index.d.ts +42 -0
  17. package/dist/analytics/index.js +139 -0
  18. package/dist/analytics/index.js.map +1 -0
  19. package/dist/analytics/index.mjs +136 -0
  20. package/dist/analytics/index.mjs.map +1 -0
  21. package/dist/angular/index.d.mts +148 -0
  22. package/dist/angular/index.d.ts +148 -0
  23. package/dist/angular/index.js +122 -0
  24. package/dist/angular/index.js.map +1 -0
  25. package/dist/angular/index.mjs +101 -0
  26. package/dist/angular/index.mjs.map +1 -0
  27. package/dist/api/index.d.mts +128 -0
  28. package/dist/api/index.d.ts +128 -0
  29. package/dist/api/index.js +1358 -0
  30. package/dist/api/index.js.map +1 -0
  31. package/dist/api/index.mjs +1332 -0
  32. package/dist/api/index.mjs.map +1 -0
  33. package/dist/auth/index.d.mts +105 -0
  34. package/dist/auth/index.d.ts +105 -0
  35. package/dist/auth/index.js +989 -0
  36. package/dist/auth/index.js.map +1 -0
  37. package/dist/auth/index.mjs +979 -0
  38. package/dist/auth/index.mjs.map +1 -0
  39. package/dist/auth.service-DNVB-L4U.d.mts +16 -0
  40. package/dist/auth.service-PjUUSUIt.d.ts +16 -0
  41. package/dist/banking/index.d.mts +1530 -0
  42. package/dist/banking/index.d.ts +1530 -0
  43. package/dist/banking/index.js +4739 -0
  44. package/dist/banking/index.js.map +1 -0
  45. package/dist/banking/index.mjs +4661 -0
  46. package/dist/banking/index.mjs.map +1 -0
  47. package/dist/cache/index.d.mts +40 -0
  48. package/dist/cache/index.d.ts +40 -0
  49. package/dist/cache/index.js +174 -0
  50. package/dist/cache/index.js.map +1 -0
  51. package/dist/cache/index.mjs +172 -0
  52. package/dist/cache/index.mjs.map +1 -0
  53. package/dist/client-profile.service-BuPeXVp5.d.mts +28 -0
  54. package/dist/client-profile.service-D5bRRYQp.d.ts +28 -0
  55. package/dist/config.models-Cqg04fAQ.d.mts +84 -0
  56. package/dist/config.models-Cqg04fAQ.d.ts +84 -0
  57. package/dist/config.service-CrCvI-JS.d.ts +31 -0
  58. package/dist/config.service-Cz4QQLlf.d.mts +31 -0
  59. package/dist/core/index.d.mts +4 -0
  60. package/dist/core/index.d.ts +4 -0
  61. package/dist/core/index.js +631 -0
  62. package/dist/core/index.js.map +1 -0
  63. package/dist/core/index.mjs +619 -0
  64. package/dist/core/index.mjs.map +1 -0
  65. package/dist/crypto-utils-DriNhLdx.d.mts +30 -0
  66. package/dist/crypto-utils-DriNhLdx.d.ts +30 -0
  67. package/dist/data-storage.service-DT6xaTxE.d.ts +51 -0
  68. package/dist/data-storage.service-LvhGRCmw.d.mts +51 -0
  69. package/dist/deeplink/index.d.mts +39 -0
  70. package/dist/deeplink/index.d.ts +39 -0
  71. package/dist/deeplink/index.js +268 -0
  72. package/dist/deeplink/index.js.map +1 -0
  73. package/dist/deeplink/index.mjs +265 -0
  74. package/dist/deeplink/index.mjs.map +1 -0
  75. package/dist/deeplink.service-Ctd5u243.d.mts +35 -0
  76. package/dist/deeplink.service-uUuTnY9_.d.ts +35 -0
  77. package/dist/dev/index.d.mts +20 -0
  78. package/dist/dev/index.d.ts +20 -0
  79. package/dist/dev/index.js +51 -0
  80. package/dist/dev/index.js.map +1 -0
  81. package/dist/dev/index.mjs +49 -0
  82. package/dist/dev/index.mjs.map +1 -0
  83. package/dist/device/index.d.mts +108 -0
  84. package/dist/device/index.d.ts +108 -0
  85. package/dist/device/index.js +960 -0
  86. package/dist/device/index.js.map +1 -0
  87. package/dist/device/index.mjs +951 -0
  88. package/dist/device/index.mjs.map +1 -0
  89. package/dist/differential-privacy-BcAv1G80.d.mts +210 -0
  90. package/dist/differential-privacy-C8mAUjZr.d.ts +210 -0
  91. package/dist/encryption/index.d.mts +75 -0
  92. package/dist/encryption/index.d.ts +75 -0
  93. package/dist/encryption/index.js +605 -0
  94. package/dist/encryption/index.js.map +1 -0
  95. package/dist/encryption/index.mjs +598 -0
  96. package/dist/encryption/index.mjs.map +1 -0
  97. package/dist/form-validator-3tkmzr_o.d.mts +72 -0
  98. package/dist/form-validator-3tkmzr_o.d.ts +72 -0
  99. package/dist/forms/index.d.mts +59 -0
  100. package/dist/forms/index.d.ts +59 -0
  101. package/dist/forms/index.js +446 -0
  102. package/dist/forms/index.js.map +1 -0
  103. package/dist/forms/index.mjs +442 -0
  104. package/dist/forms/index.mjs.map +1 -0
  105. package/dist/i18n/index.d.mts +37 -0
  106. package/dist/i18n/index.d.ts +37 -0
  107. package/dist/i18n/index.js +147 -0
  108. package/dist/i18n/index.js.map +1 -0
  109. package/dist/i18n/index.mjs +145 -0
  110. package/dist/i18n/index.mjs.map +1 -0
  111. package/dist/idempotency.service-_6LqhivP.d.mts +372 -0
  112. package/dist/idempotency.service-eOKoISRD.d.ts +372 -0
  113. package/dist/index-B_ksKpS1.d.mts +202 -0
  114. package/dist/index-CqDKWTUP.d.mts +28 -0
  115. package/dist/index-CqDKWTUP.d.ts +28 -0
  116. package/dist/index-DFqEoX_l.d.ts +202 -0
  117. package/dist/index-Dz0gOur2.d.mts +36 -0
  118. package/dist/index-Dz0gOur2.d.ts +36 -0
  119. package/dist/index.d.mts +1336 -0
  120. package/dist/index.d.ts +1336 -0
  121. package/dist/index.js +19464 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/index.mjs +19155 -0
  124. package/dist/index.mjs.map +1 -0
  125. package/dist/india/index.d.mts +75 -0
  126. package/dist/india/index.d.ts +75 -0
  127. package/dist/india/index.js +325 -0
  128. package/dist/india/index.js.map +1 -0
  129. package/dist/india/index.mjs +303 -0
  130. package/dist/india/index.mjs.map +1 -0
  131. package/dist/joop-Bx7Iwj5p.d.mts +155 -0
  132. package/dist/joop-CA3DMeOO.d.ts +155 -0
  133. package/dist/native-bridge/index.d.mts +27 -0
  134. package/dist/native-bridge/index.d.ts +27 -0
  135. package/dist/native-bridge/index.js +98 -0
  136. package/dist/native-bridge/index.js.map +1 -0
  137. package/dist/native-bridge/index.mjs +96 -0
  138. package/dist/native-bridge/index.mjs.map +1 -0
  139. package/dist/network/index.d.mts +85 -0
  140. package/dist/network/index.d.ts +85 -0
  141. package/dist/network/index.js +454 -0
  142. package/dist/network/index.js.map +1 -0
  143. package/dist/network/index.mjs +451 -0
  144. package/dist/network/index.mjs.map +1 -0
  145. package/dist/network-monitor-BIwPSXme.d.mts +179 -0
  146. package/dist/network-monitor-Bqp2hvZr.d.ts +179 -0
  147. package/dist/notification.service-Dm4fvfZf.d.mts +25 -0
  148. package/dist/notification.service-tEMKatWJ.d.ts +25 -0
  149. package/dist/observability/index.d.mts +179 -0
  150. package/dist/observability/index.d.ts +179 -0
  151. package/dist/observability/index.js +559 -0
  152. package/dist/observability/index.js.map +1 -0
  153. package/dist/observability/index.mjs +552 -0
  154. package/dist/observability/index.mjs.map +1 -0
  155. package/dist/oidc-client-DIJcClmB.d.mts +190 -0
  156. package/dist/oidc-client-DxhyE59t.d.ts +190 -0
  157. package/dist/platform/index.d.mts +73 -0
  158. package/dist/platform/index.d.ts +73 -0
  159. package/dist/platform/index.js +127 -0
  160. package/dist/platform/index.js.map +1 -0
  161. package/dist/platform/index.mjs +125 -0
  162. package/dist/platform/index.mjs.map +1 -0
  163. package/dist/pwa/index.d.mts +31 -0
  164. package/dist/pwa/index.d.ts +31 -0
  165. package/dist/pwa/index.js +247 -0
  166. package/dist/pwa/index.js.map +1 -0
  167. package/dist/pwa/index.mjs +244 -0
  168. package/dist/pwa/index.mjs.map +1 -0
  169. package/dist/react/index.d.mts +133 -0
  170. package/dist/react/index.d.ts +133 -0
  171. package/dist/react/index.js +632 -0
  172. package/dist/react/index.js.map +1 -0
  173. package/dist/react/index.mjs +630 -0
  174. package/dist/react/index.mjs.map +1 -0
  175. package/dist/router/index.d.mts +39 -0
  176. package/dist/router/index.d.ts +39 -0
  177. package/dist/router/index.js +168 -0
  178. package/dist/router/index.js.map +1 -0
  179. package/dist/router/index.mjs +166 -0
  180. package/dist/router/index.mjs.map +1 -0
  181. package/dist/security/index.d.mts +206 -0
  182. package/dist/security/index.d.ts +206 -0
  183. package/dist/security/index.js +1297 -0
  184. package/dist/security/index.js.map +1 -0
  185. package/dist/security/index.mjs +1285 -0
  186. package/dist/security/index.mjs.map +1 -0
  187. package/dist/session/index.d.mts +115 -0
  188. package/dist/session/index.d.ts +115 -0
  189. package/dist/session/index.js +297 -0
  190. package/dist/session/index.js.map +1 -0
  191. package/dist/session/index.mjs +292 -0
  192. package/dist/session/index.mjs.map +1 -0
  193. package/dist/state/index.d.mts +43 -0
  194. package/dist/state/index.d.ts +43 -0
  195. package/dist/state/index.js +156 -0
  196. package/dist/state/index.js.map +1 -0
  197. package/dist/state/index.mjs +152 -0
  198. package/dist/state/index.mjs.map +1 -0
  199. package/dist/statement-parser-BHQtXwCM.d.ts +260 -0
  200. package/dist/statement-parser-C2qNmb49.d.mts +260 -0
  201. package/dist/storage/index.d.mts +40 -0
  202. package/dist/storage/index.d.ts +40 -0
  203. package/dist/storage/index.js +256 -0
  204. package/dist/storage/index.js.map +1 -0
  205. package/dist/storage/index.mjs +252 -0
  206. package/dist/storage/index.mjs.map +1 -0
  207. package/dist/sync/index.d.mts +69 -0
  208. package/dist/sync/index.d.ts +69 -0
  209. package/dist/sync/index.js +330 -0
  210. package/dist/sync/index.js.map +1 -0
  211. package/dist/sync/index.mjs +323 -0
  212. package/dist/sync/index.mjs.map +1 -0
  213. package/dist/sync-engine-DCIMRG5s.d.ts +61 -0
  214. package/dist/sync-engine-DZqyKHkK.d.mts +61 -0
  215. package/dist/theme/index.d.mts +53 -0
  216. package/dist/theme/index.d.ts +53 -0
  217. package/dist/theme/index.js +169 -0
  218. package/dist/theme/index.js.map +1 -0
  219. package/dist/theme/index.mjs +167 -0
  220. package/dist/theme/index.mjs.map +1 -0
  221. package/dist/ui/index.d.mts +66 -0
  222. package/dist/ui/index.d.ts +66 -0
  223. package/dist/ui/index.js +811 -0
  224. package/dist/ui/index.js.map +1 -0
  225. package/dist/ui/index.mjs +803 -0
  226. package/dist/ui/index.mjs.map +1 -0
  227. package/dist/utilities/index.d.mts +199 -0
  228. package/dist/utilities/index.d.ts +199 -0
  229. package/dist/utilities/index.js +1991 -0
  230. package/dist/utilities/index.js.map +1 -0
  231. package/dist/utilities/index.mjs +1923 -0
  232. package/dist/utilities/index.mjs.map +1 -0
  233. package/dist/validation/index.d.mts +60 -0
  234. package/dist/validation/index.d.ts +60 -0
  235. package/dist/validation/index.js +460 -0
  236. package/dist/validation/index.js.map +1 -0
  237. package/dist/validation/index.mjs +455 -0
  238. package/dist/validation/index.mjs.map +1 -0
  239. package/dist/vue/index.d.mts +135 -0
  240. package/dist/vue/index.d.ts +135 -0
  241. package/dist/vue/index.js +621 -0
  242. package/dist/vue/index.js.map +1 -0
  243. package/dist/vue/index.mjs +619 -0
  244. package/dist/vue/index.mjs.map +1 -0
  245. package/dist/watermark.service-Detur5tq.d.ts +235 -0
  246. package/dist/watermark.service-QNegMeQZ.d.mts +235 -0
  247. package/dist/workers/index.d.mts +42 -0
  248. package/dist/workers/index.d.ts +42 -0
  249. package/dist/workers/index.js +359 -0
  250. package/dist/workers/index.js.map +1 -0
  251. package/dist/workers/index.mjs +356 -0
  252. package/dist/workers/index.mjs.map +1 -0
  253. package/dist/workflow/index.d.mts +99 -0
  254. package/dist/workflow/index.d.ts +99 -0
  255. package/dist/workflow/index.js +282 -0
  256. package/dist/workflow/index.js.map +1 -0
  257. package/dist/workflow/index.mjs +279 -0
  258. package/dist/workflow/index.mjs.map +1 -0
  259. package/package.json +226 -0
@@ -0,0 +1,40 @@
1
+ import { J as JoopObservable } from '../index-Dz0gOur2.mjs';
2
+
3
+ interface JoopCacheOptions {
4
+ ttlMs?: number;
5
+ maxSize?: number;
6
+ }
7
+ declare class JoopCacheService {
8
+ private _store;
9
+ private _defaultTtl;
10
+ private _maxSize;
11
+ private _hits$;
12
+ private _totalHits;
13
+ constructor(options?: JoopCacheOptions);
14
+ set<T>(key: string, value: T, ttlMs?: number): void;
15
+ get<T>(key: string): T | null;
16
+ has(key: string): boolean;
17
+ delete(key: string): boolean;
18
+ clear(): void;
19
+ /** Return cached value or compute+store it */
20
+ getOrSet<T>(key: string, factory: () => T | Promise<T>, ttlMs?: number): Promise<T>;
21
+ /** Remove all expired entries and return count removed */
22
+ prune(): number;
23
+ /** Return remaining TTL in ms for a key, or -1 if missing/expired */
24
+ ttl(key: string): number;
25
+ /** Extend TTL of an existing entry */
26
+ extend(key: string, ttlMs: number): boolean;
27
+ size(): number;
28
+ keys(): string[];
29
+ hits$(): JoopObservable<number>;
30
+ totalHits(): number;
31
+ stats(): {
32
+ size: number;
33
+ maxSize: number;
34
+ totalHits: number;
35
+ defaultTtlMs: number;
36
+ };
37
+ private _evictOldest;
38
+ }
39
+
40
+ export { type JoopCacheOptions, JoopCacheService };
@@ -0,0 +1,40 @@
1
+ import { J as JoopObservable } from '../index-Dz0gOur2.js';
2
+
3
+ interface JoopCacheOptions {
4
+ ttlMs?: number;
5
+ maxSize?: number;
6
+ }
7
+ declare class JoopCacheService {
8
+ private _store;
9
+ private _defaultTtl;
10
+ private _maxSize;
11
+ private _hits$;
12
+ private _totalHits;
13
+ constructor(options?: JoopCacheOptions);
14
+ set<T>(key: string, value: T, ttlMs?: number): void;
15
+ get<T>(key: string): T | null;
16
+ has(key: string): boolean;
17
+ delete(key: string): boolean;
18
+ clear(): void;
19
+ /** Return cached value or compute+store it */
20
+ getOrSet<T>(key: string, factory: () => T | Promise<T>, ttlMs?: number): Promise<T>;
21
+ /** Remove all expired entries and return count removed */
22
+ prune(): number;
23
+ /** Return remaining TTL in ms for a key, or -1 if missing/expired */
24
+ ttl(key: string): number;
25
+ /** Extend TTL of an existing entry */
26
+ extend(key: string, ttlMs: number): boolean;
27
+ size(): number;
28
+ keys(): string[];
29
+ hits$(): JoopObservable<number>;
30
+ totalHits(): number;
31
+ stats(): {
32
+ size: number;
33
+ maxSize: number;
34
+ totalHits: number;
35
+ defaultTtlMs: number;
36
+ };
37
+ private _evictOldest;
38
+ }
39
+
40
+ export { type JoopCacheOptions, JoopCacheService };
@@ -0,0 +1,174 @@
1
+ 'use strict';
2
+
3
+ // src/events/index.ts
4
+ var JoopSubject = class {
5
+ _listeners = [];
6
+ subscribe(listener) {
7
+ this._listeners.push(listener);
8
+ return () => {
9
+ this._listeners = this._listeners.filter((l) => l !== listener);
10
+ };
11
+ }
12
+ next(value) {
13
+ for (const listener of this._listeners) {
14
+ listener(value);
15
+ }
16
+ }
17
+ asObservable() {
18
+ return new JoopObservable((listener) => this.subscribe(listener));
19
+ }
20
+ };
21
+ var JoopBehaviorSubject = class extends JoopSubject {
22
+ _value;
23
+ constructor(initialValue) {
24
+ super();
25
+ this._value = initialValue;
26
+ }
27
+ getValue() {
28
+ return this._value;
29
+ }
30
+ next(value) {
31
+ this._value = value;
32
+ super.next(value);
33
+ }
34
+ subscribe(listener) {
35
+ listener(this._value);
36
+ return super.subscribe(listener);
37
+ }
38
+ asObservable() {
39
+ return new JoopObservable((listener) => this.subscribe(listener));
40
+ }
41
+ };
42
+ var JoopObservable = class {
43
+ constructor(_subscribeFn) {
44
+ this._subscribeFn = _subscribeFn;
45
+ }
46
+ _subscribeFn;
47
+ subscribe(listener) {
48
+ return this._subscribeFn(listener);
49
+ }
50
+ /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */
51
+ getOnce() {
52
+ let result;
53
+ const unsub = this.subscribe((v) => {
54
+ result = v;
55
+ });
56
+ unsub();
57
+ return result;
58
+ }
59
+ };
60
+
61
+ // src/cache/cache.service.ts
62
+ var JoopCacheService = class {
63
+ _store = /* @__PURE__ */ new Map();
64
+ _defaultTtl;
65
+ _maxSize;
66
+ _hits$ = new JoopBehaviorSubject(0);
67
+ _totalHits = 0;
68
+ constructor(options = {}) {
69
+ this._defaultTtl = options.ttlMs ?? 5 * 60 * 1e3;
70
+ this._maxSize = options.maxSize ?? 500;
71
+ }
72
+ set(key, value, ttlMs) {
73
+ if (this._store.size >= this._maxSize && !this._store.has(key)) {
74
+ this._evictOldest();
75
+ }
76
+ this._store.set(key, {
77
+ value,
78
+ expiresAt: Date.now() + (ttlMs ?? this._defaultTtl),
79
+ createdAt: Date.now(),
80
+ hits: 0
81
+ });
82
+ }
83
+ get(key) {
84
+ const entry = this._store.get(key);
85
+ if (!entry) return null;
86
+ if (Date.now() > entry.expiresAt) {
87
+ this._store.delete(key);
88
+ return null;
89
+ }
90
+ entry.hits++;
91
+ this._totalHits++;
92
+ this._hits$.next(this._totalHits);
93
+ return entry.value;
94
+ }
95
+ has(key) {
96
+ const entry = this._store.get(key);
97
+ if (!entry) return false;
98
+ if (Date.now() > entry.expiresAt) {
99
+ this._store.delete(key);
100
+ return false;
101
+ }
102
+ return true;
103
+ }
104
+ delete(key) {
105
+ return this._store.delete(key);
106
+ }
107
+ clear() {
108
+ this._store.clear();
109
+ }
110
+ /** Return cached value or compute+store it */
111
+ async getOrSet(key, factory, ttlMs) {
112
+ const cached = this.get(key);
113
+ if (cached !== null) return cached;
114
+ const value = await factory();
115
+ this.set(key, value, ttlMs);
116
+ return value;
117
+ }
118
+ /** Remove all expired entries and return count removed */
119
+ prune() {
120
+ const now = Date.now();
121
+ let removed = 0;
122
+ for (const [k, v] of this._store) {
123
+ if (now > v.expiresAt) {
124
+ this._store.delete(k);
125
+ removed++;
126
+ }
127
+ }
128
+ return removed;
129
+ }
130
+ /** Return remaining TTL in ms for a key, or -1 if missing/expired */
131
+ ttl(key) {
132
+ const entry = this._store.get(key);
133
+ if (!entry) return -1;
134
+ const remaining = entry.expiresAt - Date.now();
135
+ return remaining > 0 ? remaining : -1;
136
+ }
137
+ /** Extend TTL of an existing entry */
138
+ extend(key, ttlMs) {
139
+ const entry = this._store.get(key);
140
+ if (!entry || Date.now() > entry.expiresAt) return false;
141
+ entry.expiresAt = Date.now() + ttlMs;
142
+ return true;
143
+ }
144
+ size() {
145
+ return this._store.size;
146
+ }
147
+ keys() {
148
+ return [...this._store.keys()];
149
+ }
150
+ hits$() {
151
+ return this._hits$.asObservable();
152
+ }
153
+ totalHits() {
154
+ return this._totalHits;
155
+ }
156
+ stats() {
157
+ return { size: this._store.size, maxSize: this._maxSize, totalHits: this._totalHits, defaultTtlMs: this._defaultTtl };
158
+ }
159
+ _evictOldest() {
160
+ let oldestKey = "";
161
+ let oldestTime = Infinity;
162
+ for (const [k, v] of this._store) {
163
+ if (v.createdAt < oldestTime) {
164
+ oldestTime = v.createdAt;
165
+ oldestKey = k;
166
+ }
167
+ }
168
+ if (oldestKey) this._store.delete(oldestKey);
169
+ }
170
+ };
171
+
172
+ exports.JoopCacheService = JoopCacheService;
173
+ //# sourceMappingURL=index.js.map
174
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/cache/cache.service.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopCacheOptions {\n ttlMs?: number;\n maxSize?: number;\n}\n\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n createdAt: number;\n hits: number;\n}\n\nexport class JoopCacheService {\n private _store = new Map<string, CacheEntry<unknown>>();\n private _defaultTtl: number;\n private _maxSize: number;\n private _hits$ = new JoopBehaviorSubject<number>(0);\n private _totalHits = 0;\n\n constructor(options: JoopCacheOptions = {}) {\n this._defaultTtl = options.ttlMs ?? 5 * 60 * 1000; // 5 min default\n this._maxSize = options.maxSize ?? 500;\n }\n\n set<T>(key: string, value: T, ttlMs?: number): void {\n if (this._store.size >= this._maxSize && !this._store.has(key)) {\n this._evictOldest();\n }\n this._store.set(key, {\n value,\n expiresAt: Date.now() + (ttlMs ?? this._defaultTtl),\n createdAt: Date.now(),\n hits: 0,\n });\n }\n\n get<T>(key: string): T | null {\n const entry = this._store.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) { this._store.delete(key); return null; }\n entry.hits++;\n this._totalHits++;\n this._hits$.next(this._totalHits);\n return entry.value;\n }\n\n has(key: string): boolean {\n const entry = this._store.get(key);\n if (!entry) return false;\n if (Date.now() > entry.expiresAt) { this._store.delete(key); return false; }\n return true;\n }\n\n delete(key: string): boolean { return this._store.delete(key); }\n\n clear(): void { this._store.clear(); }\n\n /** Return cached value or compute+store it */\n async getOrSet<T>(key: string, factory: () => T | Promise<T>, ttlMs?: number): Promise<T> {\n const cached = this.get<T>(key);\n if (cached !== null) return cached;\n const value = await factory();\n this.set(key, value, ttlMs);\n return value;\n }\n\n /** Remove all expired entries and return count removed */\n prune(): number {\n const now = Date.now();\n let removed = 0;\n for (const [k, v] of this._store) {\n if (now > v.expiresAt) { this._store.delete(k); removed++; }\n }\n return removed;\n }\n\n /** Return remaining TTL in ms for a key, or -1 if missing/expired */\n ttl(key: string): number {\n const entry = this._store.get(key);\n if (!entry) return -1;\n const remaining = entry.expiresAt - Date.now();\n return remaining > 0 ? remaining : -1;\n }\n\n /** Extend TTL of an existing entry */\n extend(key: string, ttlMs: number): boolean {\n const entry = this._store.get(key);\n if (!entry || Date.now() > entry.expiresAt) return false;\n entry.expiresAt = Date.now() + ttlMs;\n return true;\n }\n\n size(): number { return this._store.size; }\n keys(): string[] { return [...this._store.keys()]; }\n hits$() { return this._hits$.asObservable(); }\n totalHits(): number { return this._totalHits; }\n\n stats(): { size: number; maxSize: number; totalHits: number; defaultTtlMs: number } {\n return { size: this._store.size, maxSize: this._maxSize, totalHits: this._totalHits, defaultTtlMs: this._defaultTtl };\n }\n\n private _evictOldest(): void {\n let oldestKey = '';\n let oldestTime = Infinity;\n for (const [k, v] of this._store) {\n if (v.createdAt < oldestTime) { oldestTime = v.createdAt; oldestKey = k; }\n }\n if (oldestKey) this._store.delete(oldestKey);\n }\n}\n"]}
@@ -0,0 +1,172 @@
1
+ // src/events/index.ts
2
+ var JoopSubject = class {
3
+ _listeners = [];
4
+ subscribe(listener) {
5
+ this._listeners.push(listener);
6
+ return () => {
7
+ this._listeners = this._listeners.filter((l) => l !== listener);
8
+ };
9
+ }
10
+ next(value) {
11
+ for (const listener of this._listeners) {
12
+ listener(value);
13
+ }
14
+ }
15
+ asObservable() {
16
+ return new JoopObservable((listener) => this.subscribe(listener));
17
+ }
18
+ };
19
+ var JoopBehaviorSubject = class extends JoopSubject {
20
+ _value;
21
+ constructor(initialValue) {
22
+ super();
23
+ this._value = initialValue;
24
+ }
25
+ getValue() {
26
+ return this._value;
27
+ }
28
+ next(value) {
29
+ this._value = value;
30
+ super.next(value);
31
+ }
32
+ subscribe(listener) {
33
+ listener(this._value);
34
+ return super.subscribe(listener);
35
+ }
36
+ asObservable() {
37
+ return new JoopObservable((listener) => this.subscribe(listener));
38
+ }
39
+ };
40
+ var JoopObservable = class {
41
+ constructor(_subscribeFn) {
42
+ this._subscribeFn = _subscribeFn;
43
+ }
44
+ _subscribeFn;
45
+ subscribe(listener) {
46
+ return this._subscribeFn(listener);
47
+ }
48
+ /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */
49
+ getOnce() {
50
+ let result;
51
+ const unsub = this.subscribe((v) => {
52
+ result = v;
53
+ });
54
+ unsub();
55
+ return result;
56
+ }
57
+ };
58
+
59
+ // src/cache/cache.service.ts
60
+ var JoopCacheService = class {
61
+ _store = /* @__PURE__ */ new Map();
62
+ _defaultTtl;
63
+ _maxSize;
64
+ _hits$ = new JoopBehaviorSubject(0);
65
+ _totalHits = 0;
66
+ constructor(options = {}) {
67
+ this._defaultTtl = options.ttlMs ?? 5 * 60 * 1e3;
68
+ this._maxSize = options.maxSize ?? 500;
69
+ }
70
+ set(key, value, ttlMs) {
71
+ if (this._store.size >= this._maxSize && !this._store.has(key)) {
72
+ this._evictOldest();
73
+ }
74
+ this._store.set(key, {
75
+ value,
76
+ expiresAt: Date.now() + (ttlMs ?? this._defaultTtl),
77
+ createdAt: Date.now(),
78
+ hits: 0
79
+ });
80
+ }
81
+ get(key) {
82
+ const entry = this._store.get(key);
83
+ if (!entry) return null;
84
+ if (Date.now() > entry.expiresAt) {
85
+ this._store.delete(key);
86
+ return null;
87
+ }
88
+ entry.hits++;
89
+ this._totalHits++;
90
+ this._hits$.next(this._totalHits);
91
+ return entry.value;
92
+ }
93
+ has(key) {
94
+ const entry = this._store.get(key);
95
+ if (!entry) return false;
96
+ if (Date.now() > entry.expiresAt) {
97
+ this._store.delete(key);
98
+ return false;
99
+ }
100
+ return true;
101
+ }
102
+ delete(key) {
103
+ return this._store.delete(key);
104
+ }
105
+ clear() {
106
+ this._store.clear();
107
+ }
108
+ /** Return cached value or compute+store it */
109
+ async getOrSet(key, factory, ttlMs) {
110
+ const cached = this.get(key);
111
+ if (cached !== null) return cached;
112
+ const value = await factory();
113
+ this.set(key, value, ttlMs);
114
+ return value;
115
+ }
116
+ /** Remove all expired entries and return count removed */
117
+ prune() {
118
+ const now = Date.now();
119
+ let removed = 0;
120
+ for (const [k, v] of this._store) {
121
+ if (now > v.expiresAt) {
122
+ this._store.delete(k);
123
+ removed++;
124
+ }
125
+ }
126
+ return removed;
127
+ }
128
+ /** Return remaining TTL in ms for a key, or -1 if missing/expired */
129
+ ttl(key) {
130
+ const entry = this._store.get(key);
131
+ if (!entry) return -1;
132
+ const remaining = entry.expiresAt - Date.now();
133
+ return remaining > 0 ? remaining : -1;
134
+ }
135
+ /** Extend TTL of an existing entry */
136
+ extend(key, ttlMs) {
137
+ const entry = this._store.get(key);
138
+ if (!entry || Date.now() > entry.expiresAt) return false;
139
+ entry.expiresAt = Date.now() + ttlMs;
140
+ return true;
141
+ }
142
+ size() {
143
+ return this._store.size;
144
+ }
145
+ keys() {
146
+ return [...this._store.keys()];
147
+ }
148
+ hits$() {
149
+ return this._hits$.asObservable();
150
+ }
151
+ totalHits() {
152
+ return this._totalHits;
153
+ }
154
+ stats() {
155
+ return { size: this._store.size, maxSize: this._maxSize, totalHits: this._totalHits, defaultTtlMs: this._defaultTtl };
156
+ }
157
+ _evictOldest() {
158
+ let oldestKey = "";
159
+ let oldestTime = Infinity;
160
+ for (const [k, v] of this._store) {
161
+ if (v.createdAt < oldestTime) {
162
+ oldestTime = v.createdAt;
163
+ oldestKey = k;
164
+ }
165
+ }
166
+ if (oldestKey) this._store.delete(oldestKey);
167
+ }
168
+ };
169
+
170
+ export { JoopCacheService };
171
+ //# sourceMappingURL=index.mjs.map
172
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/cache/cache.service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopCacheOptions {\n ttlMs?: number;\n maxSize?: number;\n}\n\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n createdAt: number;\n hits: number;\n}\n\nexport class JoopCacheService {\n private _store = new Map<string, CacheEntry<unknown>>();\n private _defaultTtl: number;\n private _maxSize: number;\n private _hits$ = new JoopBehaviorSubject<number>(0);\n private _totalHits = 0;\n\n constructor(options: JoopCacheOptions = {}) {\n this._defaultTtl = options.ttlMs ?? 5 * 60 * 1000; // 5 min default\n this._maxSize = options.maxSize ?? 500;\n }\n\n set<T>(key: string, value: T, ttlMs?: number): void {\n if (this._store.size >= this._maxSize && !this._store.has(key)) {\n this._evictOldest();\n }\n this._store.set(key, {\n value,\n expiresAt: Date.now() + (ttlMs ?? this._defaultTtl),\n createdAt: Date.now(),\n hits: 0,\n });\n }\n\n get<T>(key: string): T | null {\n const entry = this._store.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) { this._store.delete(key); return null; }\n entry.hits++;\n this._totalHits++;\n this._hits$.next(this._totalHits);\n return entry.value;\n }\n\n has(key: string): boolean {\n const entry = this._store.get(key);\n if (!entry) return false;\n if (Date.now() > entry.expiresAt) { this._store.delete(key); return false; }\n return true;\n }\n\n delete(key: string): boolean { return this._store.delete(key); }\n\n clear(): void { this._store.clear(); }\n\n /** Return cached value or compute+store it */\n async getOrSet<T>(key: string, factory: () => T | Promise<T>, ttlMs?: number): Promise<T> {\n const cached = this.get<T>(key);\n if (cached !== null) return cached;\n const value = await factory();\n this.set(key, value, ttlMs);\n return value;\n }\n\n /** Remove all expired entries and return count removed */\n prune(): number {\n const now = Date.now();\n let removed = 0;\n for (const [k, v] of this._store) {\n if (now > v.expiresAt) { this._store.delete(k); removed++; }\n }\n return removed;\n }\n\n /** Return remaining TTL in ms for a key, or -1 if missing/expired */\n ttl(key: string): number {\n const entry = this._store.get(key);\n if (!entry) return -1;\n const remaining = entry.expiresAt - Date.now();\n return remaining > 0 ? remaining : -1;\n }\n\n /** Extend TTL of an existing entry */\n extend(key: string, ttlMs: number): boolean {\n const entry = this._store.get(key);\n if (!entry || Date.now() > entry.expiresAt) return false;\n entry.expiresAt = Date.now() + ttlMs;\n return true;\n }\n\n size(): number { return this._store.size; }\n keys(): string[] { return [...this._store.keys()]; }\n hits$() { return this._hits$.asObservable(); }\n totalHits(): number { return this._totalHits; }\n\n stats(): { size: number; maxSize: number; totalHits: number; defaultTtlMs: number } {\n return { size: this._store.size, maxSize: this._maxSize, totalHits: this._totalHits, defaultTtlMs: this._defaultTtl };\n }\n\n private _evictOldest(): void {\n let oldestKey = '';\n let oldestTime = Infinity;\n for (const [k, v] of this._store) {\n if (v.createdAt < oldestTime) { oldestTime = v.createdAt; oldestKey = k; }\n }\n if (oldestKey) this._store.delete(oldestKey);\n }\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { b as JoopTimeout } from './config.models-Cqg04fAQ.mjs';
2
+
3
+ /**
4
+ * Holds runtime client-session state: language, theme, authorization tokens,
5
+ * request metadata, and pagination state.
6
+ * No framework coupling — instantiate directly or use the singleton.
7
+ */
8
+ declare class JoopClientProfile {
9
+ language: string;
10
+ theme: string;
11
+ baseUrl: string;
12
+ authToken: string;
13
+ pageToken: string;
14
+ isInitialRequest: boolean;
15
+ currentAction: string;
16
+ screenId: string;
17
+ useExternalAPI: boolean;
18
+ model: string;
19
+ /** Session timeout configuration, updated from server response. */
20
+ timeoutInfo: JoopTimeout;
21
+ /** Any extra fields the host app wants to stash on the profile. */
22
+ extra: Record<string, any>;
23
+ /** Reset transient per-session state (called on logout). */
24
+ clearSession(): void;
25
+ }
26
+ declare const clientProfile: JoopClientProfile;
27
+
28
+ export { JoopClientProfile as J, clientProfile as c };
@@ -0,0 +1,28 @@
1
+ import { b as JoopTimeout } from './config.models-Cqg04fAQ.js';
2
+
3
+ /**
4
+ * Holds runtime client-session state: language, theme, authorization tokens,
5
+ * request metadata, and pagination state.
6
+ * No framework coupling — instantiate directly or use the singleton.
7
+ */
8
+ declare class JoopClientProfile {
9
+ language: string;
10
+ theme: string;
11
+ baseUrl: string;
12
+ authToken: string;
13
+ pageToken: string;
14
+ isInitialRequest: boolean;
15
+ currentAction: string;
16
+ screenId: string;
17
+ useExternalAPI: boolean;
18
+ model: string;
19
+ /** Session timeout configuration, updated from server response. */
20
+ timeoutInfo: JoopTimeout;
21
+ /** Any extra fields the host app wants to stash on the profile. */
22
+ extra: Record<string, any>;
23
+ /** Reset transient per-session state (called on logout). */
24
+ clearSession(): void;
25
+ }
26
+ declare const clientProfile: JoopClientProfile;
27
+
28
+ export { JoopClientProfile as J, clientProfile as c };
@@ -0,0 +1,84 @@
1
+ interface JoopConfig {
2
+ app: JoopApp;
3
+ timeout?: JoopTimeout;
4
+ localization?: JoopLocalization;
5
+ theme?: JoopTheme;
6
+ logger?: JoopLoggerConfig;
7
+ loader?: JoopLoaderConfig;
8
+ isDevMode?: boolean;
9
+ openBanking?: JoopOpenBankingConfig;
10
+ payment?: JoopPaymentGatewayConfig;
11
+ [key: string]: any;
12
+ }
13
+ interface JoopApp {
14
+ id: string;
15
+ baseUrl: string;
16
+ initScreen?: string;
17
+ initService?: string;
18
+ logoutService?: string;
19
+ externalUrl?: string;
20
+ useExternalAPI?: boolean;
21
+ requestTimeHeader?: boolean;
22
+ }
23
+ interface JoopTimeout {
24
+ requestTimeout: number;
25
+ session: JoopSession;
26
+ }
27
+ interface JoopSession {
28
+ enable: boolean;
29
+ timeout: number;
30
+ waitTimeout: number;
31
+ ignoreServices: string[];
32
+ logoutService?: string;
33
+ }
34
+ interface JoopLocalization {
35
+ languages: JoopLanguage[];
36
+ defaultLanguage: {
37
+ language: string;
38
+ enable: boolean;
39
+ };
40
+ useLocalTranslations?: boolean;
41
+ lazyLoadTranslations?: boolean;
42
+ timezone?: string;
43
+ }
44
+ interface JoopLanguage {
45
+ code: string;
46
+ name: string;
47
+ culture: string;
48
+ }
49
+ interface JoopTheme {
50
+ id?: number;
51
+ name: string;
52
+ isThemeFromServer?: boolean;
53
+ }
54
+ interface JoopLoggerConfig {
55
+ enable: boolean;
56
+ enableDate?: boolean;
57
+ typeConfig?: JoopLoggerTypeConfig;
58
+ }
59
+ interface JoopLoggerTypeConfig {
60
+ debug?: boolean;
61
+ log?: boolean;
62
+ info?: boolean;
63
+ warn?: boolean;
64
+ error?: boolean;
65
+ all?: boolean;
66
+ }
67
+ interface JoopLoaderConfig {
68
+ enable: boolean;
69
+ }
70
+ interface JoopOpenBankingConfig {
71
+ clientId: string;
72
+ clientSecret: string;
73
+ baseUrl: string;
74
+ tokenUrl: string;
75
+ }
76
+ interface JoopPaymentGatewayConfig {
77
+ gatewayUrl: string;
78
+ merchantId: string;
79
+ apiKey: string;
80
+ timeoutMs?: number;
81
+ pollIntervalMs?: number;
82
+ }
83
+
84
+ export type { JoopConfig as J, JoopApp as a, JoopTimeout as b, JoopSession as c, JoopLocalization as d, JoopLoggerConfig as e, JoopLanguage as f, JoopLoggerTypeConfig as g, JoopOpenBankingConfig as h, JoopPaymentGatewayConfig as i };