@hyperfrontend/time-utils 0.0.2 → 0.0.3

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [0.0.3](https://github.com/AndrewRedican/hyperfrontend/compare/lib-time-utils@0.0.2...lib-time-utils@0.0.3) (2026-03-02)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **lib-time-utils:** correct package exports and dependencies ([3b9096b](https://github.com/AndrewRedican/hyperfrontend/commit/3b9096b54337c2c2f3e06d6b97865a772e79aad9))
11
+
5
12
  ## [0.0.2](https://github.com/AndrewRedican/hyperfrontend/compare/lib-time-utils@0.0.1...lib-time-utils@0.0.2) (2026-02-26)
6
13
 
7
14
  ## 0.0.1 (2026-02-15)
@@ -1,6 +1,92 @@
1
1
  var HyperfrontendTimeUtils = (function (exports) {
2
2
  'use strict';
3
3
 
4
+ /**
5
+ * Safe copies of Date built-in via factory function and static methods.
6
+ *
7
+ * Since constructors cannot be safely captured via Object.assign, this module
8
+ * provides a factory function that uses Reflect.construct internally.
9
+ *
10
+ * These references are captured at module initialization time to protect against
11
+ * prototype pollution attacks. Import only what you need for tree-shaking.
12
+ *
13
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/date
14
+ */
15
+ // Capture references at module initialization time
16
+ const _Date = globalThis.Date;
17
+ const _Reflect$2 = globalThis.Reflect;
18
+ function createDate(...args) {
19
+ return _Reflect$2.construct(_Date, args);
20
+ }
21
+ /**
22
+ * (Safe copy) Returns the number of milliseconds elapsed since January 1, 1970 00:00:00 UTC.
23
+ */
24
+ const dateNow = _Date.now;
25
+
26
+ /**
27
+ * Safe copies of Object built-in methods.
28
+ *
29
+ * These references are captured at module initialization time to protect against
30
+ * prototype pollution attacks. Import only what you need for tree-shaking.
31
+ *
32
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/object
33
+ */
34
+ // Capture references at module initialization time
35
+ const _Object = globalThis.Object;
36
+ /**
37
+ * (Safe copy) Prevents modification of existing property attributes and values,
38
+ * and prevents the addition of new properties.
39
+ */
40
+ const freeze = _Object.freeze;
41
+
42
+ /**
43
+ * Safe copies of Timer/Scheduling built-in functions.
44
+ *
45
+ * These references are captured at module initialization time to protect against
46
+ * prototype pollution attacks. Import only what you need for tree-shaking.
47
+ *
48
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/timers
49
+ */
50
+ // Capture references at module initialization time
51
+ const _setTimeout = globalThis.setTimeout;
52
+ const _setInterval = globalThis.setInterval;
53
+ const _clearTimeout = globalThis.clearTimeout;
54
+ const _clearInterval = globalThis.clearInterval;
55
+ /**
56
+ * (Safe copy) Sets a timer which executes a function once the timer expires.
57
+ *
58
+ * @param callback - Function to call when the timer elapses.
59
+ * @param delay - Time in milliseconds before executing.
60
+ * @param args - Additional arguments to pass to the callback.
61
+ * @returns A numeric ID for the timer.
62
+ */
63
+ const setTimeout = (callback, delay, ...args) => _setTimeout(callback, delay, ...args);
64
+ /**
65
+ * (Safe copy) Repeatedly calls a function with a fixed time delay between each call.
66
+ *
67
+ * @param callback - Function to call at each interval.
68
+ * @param delay - Time in milliseconds between calls.
69
+ * @param args - Additional arguments to pass to the callback.
70
+ * @returns A numeric ID for the interval.
71
+ */
72
+ const setInterval = (callback, delay, ...args) => _setInterval(callback, delay, ...args);
73
+ /**
74
+ * (Safe copy) Cancels a timeout previously established by setTimeout.
75
+ *
76
+ * @param id - The identifier of the timeout to cancel.
77
+ */
78
+ const clearTimeout = (id) => {
79
+ _clearTimeout(id);
80
+ };
81
+ /**
82
+ * (Safe copy) Cancels a timed, repeating action previously established by setInterval.
83
+ *
84
+ * @param id - The identifier of the interval to cancel.
85
+ */
86
+ const clearInterval = (id) => {
87
+ _clearInterval(id);
88
+ };
89
+
4
90
  /**
5
91
  * Creates an interval loop that invokes one or more subscribed callback functions
6
92
  * at the specified internal (in milliseconds).
@@ -17,7 +103,7 @@ var HyperfrontendTimeUtils = (function (exports) {
17
103
  const start = () => {
18
104
  if (clockId === null) {
19
105
  clockId = setInterval(() => {
20
- const currentTime = new Date();
106
+ const currentTime = createDate();
21
107
  subscribers.forEach((subscriber) => subscriber(currentTime));
22
108
  }, interval);
23
109
  }
@@ -34,7 +120,7 @@ var HyperfrontendTimeUtils = (function (exports) {
34
120
  const unsubscribe = (callback) => {
35
121
  subscribers = subscribers.filter((subscriber) => subscriber !== callback);
36
122
  };
37
- return Object.freeze({ start, stop, subscribe, unsubscribe, interval });
123
+ return freeze({ start, stop, subscribe, unsubscribe, interval });
38
124
  }
39
125
 
40
126
  /**
@@ -52,7 +138,7 @@ var HyperfrontendTimeUtils = (function (exports) {
52
138
  const pause = () => {
53
139
  if (timerId !== null) {
54
140
  clearTimeout(timerId);
55
- const now = Date.now();
141
+ const now = dateNow();
56
142
  /* istanbul ignore else - start is always set when timerId is not null */
57
143
  if (start !== null) {
58
144
  remaining -= now - start;
@@ -62,7 +148,7 @@ var HyperfrontendTimeUtils = (function (exports) {
62
148
  };
63
149
  const resume = () => {
64
150
  if (timerId === null) {
65
- start = Date.now();
151
+ start = dateNow();
66
152
  timerId = setTimeout(() => {
67
153
  callback();
68
154
  timerId = null;
@@ -74,9 +160,66 @@ var HyperfrontendTimeUtils = (function (exports) {
74
160
  remaining = newDelay;
75
161
  resume();
76
162
  };
77
- return Object.freeze({ pause, resume, reset });
163
+ return freeze({ pause, resume, reset });
78
164
  }
79
165
 
166
+ /**
167
+ * Safe copies of Error built-ins via factory functions.
168
+ *
169
+ * Since constructors cannot be safely captured via Object.assign, this module
170
+ * provides factory functions that use Reflect.construct internally.
171
+ *
172
+ * These references are captured at module initialization time to protect against
173
+ * prototype pollution attacks. Import only what you need for tree-shaking.
174
+ *
175
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/error
176
+ */
177
+ // Capture references at module initialization time
178
+ const _Error = globalThis.Error;
179
+ const _Reflect$1 = globalThis.Reflect;
180
+ /**
181
+ * (Safe copy) Creates a new Error using the captured Error constructor.
182
+ * Use this instead of `new Error()`.
183
+ *
184
+ * @param message - Optional error message.
185
+ * @param options - Optional error options.
186
+ * @returns A new Error instance.
187
+ */
188
+ const createError = (message, options) => _Reflect$1.construct(_Error, [message, options]);
189
+
190
+ /**
191
+ * Safe copies of Math built-in methods.
192
+ *
193
+ * These references are captured at module initialization time to protect against
194
+ * prototype pollution attacks. Import only what you need for tree-shaking.
195
+ *
196
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/math
197
+ */
198
+ // Capture references at module initialization time
199
+ const _Math = globalThis.Math;
200
+ /**
201
+ * (Safe copy) Returns the largest integer less than or equal to a number.
202
+ */
203
+ const floor = _Math.floor;
204
+
205
+ /**
206
+ * Safe copies of Number built-in methods and constants.
207
+ *
208
+ * These references are captured at module initialization time to protect against
209
+ * prototype pollution attacks. Import only what you need for tree-shaking.
210
+ *
211
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/number
212
+ */
213
+ // Capture references at module initialization time
214
+ const _isNaN = globalThis.isNaN;
215
+ // ============================================================================
216
+ // Global Type Checking (legacy, less strict)
217
+ // ============================================================================
218
+ /**
219
+ * (Safe copy) Global isNaN function (coerces to number first, less strict than Number.isNaN).
220
+ */
221
+ const globalIsNaN = _isNaN;
222
+
80
223
  /**
81
224
  * Normalizes a given time to the nearest base time window.
82
225
  *
@@ -85,16 +228,16 @@ var HyperfrontendTimeUtils = (function (exports) {
85
228
  * @returns A new Date object normalized to the start of the time window
86
229
  */
87
230
  function normalizeToBaseTimeWindow(time, baseTimeWindow) {
88
- if (!time || !(time instanceof Date) || isNaN(time.getTime())) {
89
- throw new Error('Invalid time input');
231
+ if (!time || !(time instanceof Date) || globalIsNaN(time.getTime())) {
232
+ throw createError('Invalid time input');
90
233
  }
91
234
  if (baseTimeWindow <= 0) {
92
- throw new Error('Base time window must be positive');
235
+ throw createError('Base time window must be positive');
93
236
  }
94
237
  const timeInMs = time.getTime();
95
238
  const windowInMs = baseTimeWindow * 60 * 1000;
96
- const normalizedTimeInMs = Math.floor(timeInMs / windowInMs) * windowInMs;
97
- return new Date(normalizedTimeInMs);
239
+ const normalizedTimeInMs = floor(timeInMs / windowInMs) * windowInMs;
240
+ return createDate(normalizedTimeInMs);
98
241
  }
99
242
 
100
243
  /**
@@ -109,6 +252,59 @@ var HyperfrontendTimeUtils = (function (exports) {
109
252
  return () => clearInterval(timerId);
110
253
  }
111
254
 
255
+ /**
256
+ * Safe copies of Promise built-in methods via factory functions.
257
+ *
258
+ * Since constructors cannot be safely captured via Object.assign, this module
259
+ * provides factory functions that use Reflect.construct internally.
260
+ *
261
+ * These references are captured at module initialization time to protect against
262
+ * prototype pollution attacks. Import only what you need for tree-shaking.
263
+ *
264
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/promise
265
+ */
266
+ // Capture references at module initialization time
267
+ const _Promise = globalThis.Promise;
268
+ const _Reflect = globalThis.Reflect;
269
+ /**
270
+ * (Safe copy) Creates a new Promise using the captured Promise constructor.
271
+ * Use this instead of `new Promise()`.
272
+ *
273
+ * @param executor - The executor function.
274
+ * @returns A new Promise instance.
275
+ */
276
+ const createPromise = (executor) => _Reflect.construct(_Promise, [executor]);
277
+ /**
278
+ * (Safe copy) Returns a Promise that resolves with the given value.
279
+ */
280
+ _Promise.resolve.bind(_Promise);
281
+ /**
282
+ * (Safe copy) Returns a Promise that rejects with the given reason.
283
+ */
284
+ _Promise.reject.bind(_Promise);
285
+ /**
286
+ * (Safe copy) Returns a Promise that resolves when all promises resolve.
287
+ */
288
+ _Promise.all.bind(_Promise);
289
+ /**
290
+ * (Safe copy) Returns a Promise that resolves/rejects with the first settled promise.
291
+ */
292
+ _Promise.race.bind(_Promise);
293
+ /**
294
+ * (Safe copy) Returns a Promise that resolves when all promises settle.
295
+ */
296
+ _Promise.allSettled.bind(_Promise);
297
+ /**
298
+ * (Safe copy) Returns a Promise that resolves with the first fulfilled promise.
299
+ */
300
+ _Promise.any.bind(_Promise);
301
+ /**
302
+ * (Safe copy) Creates a Promise along with its resolve and reject functions.
303
+ * Note: Available only in ES2024+ environments.
304
+ */
305
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
306
+ _Promise.withResolvers?.bind(_Promise);
307
+
112
308
  /**
113
309
  * Pauses execution for a specified duration.
114
310
  *
@@ -116,7 +312,7 @@ var HyperfrontendTimeUtils = (function (exports) {
116
312
  * @returns A promise that resolves after the specified duration
117
313
  */
118
314
  function sleep(milliseconds) {
119
- return new Promise((resolve) => setTimeout(resolve, milliseconds));
315
+ return createPromise((resolve) => setTimeout(resolve, milliseconds));
120
316
  }
121
317
 
122
318
  exports.createClock = createClock;
@@ -1 +1 @@
1
- {"version":3,"file":"index.iife.js","sources":["../../../../../../../../../../libs/utils/time/src/create-clock.ts","../../../../../../../../../../libs/utils/time/src/create-timer.ts","../../../../../../../../../../libs/utils/time/src/normalize-to-base-time-window.ts","../../../../../../../../../../libs/utils/time/src/set-interval-callback.ts","../../../../../../../../../../libs/utils/time/src/sleep.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.iife.js","sources":["../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/date/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/object/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/timers/index.ts","../../../../../../../../../../libs/utils/time/src/create-clock.ts","../../../../../../../../../../libs/utils/time/src/create-timer.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/error/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/math/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/number/index.ts","../../../../../../../../../../libs/utils/time/src/normalize-to-base-time-window.ts","../../../../../../../../../../libs/utils/time/src/set-interval-callback.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/promise/index.ts","../../../../../../../../../../libs/utils/time/src/sleep.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null],"names":["_Reflect"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var HyperfrontendTimeUtils=function(e){"use strict";return e.createClock=function(e=1e3){let t=null,n=[];return Object.freeze({start:()=>{null===t&&(t=setInterval(()=>{const e=new Date;n.forEach(t=>t(e))},e))},stop:()=>{null!==t&&(clearInterval(t),t=null)},subscribe:e=>{n.push(e)},unsubscribe:e=>{n=n.filter(t=>t!==e)},interval:e})},e.createTimer=function(e,t){let n=null,r=null,l=t;const i=()=>{if(null!==n){clearTimeout(n);const e=Date.now();null!==r&&(l-=e-r),n=null}},u=()=>{null===n&&(r=Date.now(),n=setTimeout(()=>{e(),n=null},l))};return Object.freeze({pause:i,resume:u,reset:(e=t)=>{i(),l=e,u()}})},e.normalizeToBaseTimeWindow=function(e,t){if(!e||!(e instanceof Date)||isNaN(e.getTime()))throw new Error("Invalid time input");if(t<=0)throw new Error("Base time window must be positive");const n=e.getTime(),r=60*t*1e3,l=Math.floor(n/r)*r;return new Date(l)},e.setIntervalCallback=function(e,t){const n=setInterval(e,t);return()=>clearInterval(n)},e.sleep=function(e){return new Promise(t=>setTimeout(t,e))},e}({});
1
+ var HyperfrontendTimeUtils=function(e){"use strict";const l=globalThis.Date,t=globalThis.Reflect;function n(...e){return t.construct(l,e)}const i=l.now,o=globalThis.Object.freeze,s=globalThis.setTimeout,r=globalThis.setInterval,a=globalThis.clearTimeout,c=globalThis.clearInterval,u=(e,l,...t)=>s(e,l,...t),b=(e,l,...t)=>r(e,l,...t),T=e=>{c(e)};const f=globalThis.Error,h=globalThis.Reflect,g=(e,l)=>h.construct(f,[e,l]),m=globalThis.Math.floor,d=globalThis.isNaN;const v=globalThis.Promise,p=globalThis.Reflect;return v.resolve.bind(v),v.reject.bind(v),v.all.bind(v),v.race.bind(v),v.allSettled.bind(v),v.any.bind(v),v.withResolvers?.bind(v),e.createClock=function(e=1e3){let l=null,t=[];return o({start:()=>{null===l&&(l=b(()=>{const e=n();t.forEach(l=>l(e))},e))},stop:()=>{null!==l&&(T(l),l=null)},subscribe:e=>{t.push(e)},unsubscribe:e=>{t=t.filter(l=>l!==e)},interval:e})},e.createTimer=function(e,l){let t=null,n=null,s=l;const r=()=>{if(null!==t){a(t);const e=i();null!==n&&(s-=e-n),t=null}},c=()=>{null===t&&(n=i(),t=u(()=>{e(),t=null},s))};return o({pause:r,resume:c,reset:(e=l)=>{r(),s=e,c()}})},e.normalizeToBaseTimeWindow=function(e,l){if(!e||!(e instanceof Date)||d(e.getTime()))throw g("Invalid time input");if(l<=0)throw g("Base time window must be positive");const t=e.getTime(),i=60*l*1e3;return n(m(t/i)*i)},e.setIntervalCallback=function(e,l){const t=b(e,l);return()=>T(t)},e.sleep=function(e){return l=l=>u(l,e),p.construct(v,[l]);var l},e}({});
2
2
  //# sourceMappingURL=index.iife.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.iife.min.js","sources":["../../../../../../../../../../libs/utils/time/src/create-clock.ts","../../../../../../../../../../libs/utils/time/src/create-timer.ts","../../../../../../../../../../libs/utils/time/src/normalize-to-base-time-window.ts","../../../../../../../../../../libs/utils/time/src/set-interval-callback.ts","../../../../../../../../../../libs/utils/time/src/sleep.ts"],"sourcesContent":[null,null,null,null,null],"names":["interval","clockId","subscribers","Object","freeze","start","setInterval","currentTime","Date","forEach","subscriber","stop","clearInterval","subscribe","callback","push","unsubscribe","filter","delay","timerId","remaining","pause","clearTimeout","now","resume","setTimeout","reset","newDelay","time","baseTimeWindow","isNaN","getTime","Error","timeInMs","windowInMs","normalizedTimeInMs","Math","floor","milliseconds","Promise","resolve"],"mappings":"yEAmBM,SAAsBA,EAAW,KACrC,IAAIC,EAAiC,KACjCC,EAA+C,GA0BnD,OAAOC,OAAOC,OAAO,CAAEC,MAxBT,KACI,OAAZJ,IACFA,EAAUK,YAAY,KACpB,MAAMC,EAAc,IAAIC,KACxBN,EAAYO,QAASC,GAAeA,EAAWH,KAC9CP,KAmBuBW,KAfjB,KACK,OAAZV,IACFW,cAAcX,GACdA,EAAU,OAYsBY,UARjBC,IACjBZ,EAAYa,KAAKD,IAO4BE,YAJ1BF,IACnBZ,EAAcA,EAAYe,OAAQP,GAAeA,IAAeI,IAGNd,YAC9D,gBC/BM,SAAsBc,EAAsBI,GAChD,IAAIC,EAAiC,KACjCd,EAAuB,KACvBe,EAAoBF,EAExB,MAAMG,EAAQ,KACZ,GAAgB,OAAZF,EAAkB,CACpBG,aAAaH,GACb,MAAMI,EAAMf,KAAKe,MAEH,OAAVlB,IACFe,GAAaG,EAAMlB,GAErBc,EAAU,IACZ,GAGIK,EAAS,KACG,OAAZL,IACFd,EAAQG,KAAKe,MACbJ,EAAUM,WAAW,KACnBX,IACAK,EAAU,MACTC,KAUP,OAAOjB,OAAOC,OAAO,CAAEiB,QAAOG,SAAQE,MANxB,CAACC,EAAmBT,KAChCG,IACAD,EAAYO,EACZH,MAIJ,8BC5CM,SAAoCI,EAAYC,GACpD,IAAKD,KAAUA,aAAgBpB,OAASsB,MAAMF,EAAKG,WACjD,MAAM,IAAIC,MAAM,sBAGlB,GAAIH,GAAkB,EACpB,MAAM,IAAIG,MAAM,qCAGlB,MAAMC,EAAWL,EAAKG,UAChBG,EAA8B,GAAjBL,EAAsB,IACnCM,EAAqBC,KAAKC,MAAMJ,EAAWC,GAAcA,EAC/D,OAAO,IAAI1B,KAAK2B,EAClB,wBCbM,SAA8BrB,EAAsBd,GACxD,MAAMmB,EAA0Bb,YAAYQ,EAAUd,GACtD,MAAO,IAAYY,cAAcO,EACnC,UCJM,SAAgBmB,GACpB,OAAO,IAAIC,QAASC,GAAYf,WAAWe,EAASF,GACtD"}
1
+ {"version":3,"file":"index.iife.min.js","sources":["../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/date/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/object/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/timers/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/error/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/math/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/number/index.ts","../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/promise/index.ts","../../../../../../../../../../libs/utils/time/src/create-clock.ts","../../../../../../../../../../libs/utils/time/src/create-timer.ts","../../../../../../../../../../libs/utils/time/src/normalize-to-base-time-window.ts","../../../../../../../../../../libs/utils/time/src/set-interval-callback.ts","../../../../../../../../../../libs/utils/time/src/sleep.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null],"names":["_Date","globalThis","Date","_Reflect","Reflect","createDate","args","construct","dateNow","now","freeze","Object","_setTimeout","setTimeout","_setInterval","setInterval","_clearTimeout","clearTimeout","_clearInterval","clearInterval","callback","delay","id","_Error","Error","createError","message","options","floor","Math","globalIsNaN","isNaN","_Promise","Promise","resolve","bind","reject","all","race","allSettled","any","withResolvers","interval","clockId","subscribers","start","currentTime","forEach","subscriber","stop","subscribe","push","unsubscribe","filter","timerId","remaining","pause","resume","reset","newDelay","time","baseTimeWindow","getTime","timeInMs","windowInMs","milliseconds","executor"],"mappings":"oDAaA,MAAMA,EAAQC,WAAWC,KACnBC,EAAWF,WAAWG,QAoBtB,SAAUC,KAAcC,GAC5B,OAAaH,EAASI,UAAUP,EAAOM,EACzC,CAKO,MAAME,EAAUR,EAAMS,ICrBhBC,EAVGT,WAAWU,OAUGD,OCVxBE,EAAcX,WAAWY,WACzBC,EAAeb,WAAWc,YAC1BC,EAAgBf,WAAWgB,aAC3BC,EAAiBjB,WAAWkB,cAcrBN,EAAa,CACxBO,EACAC,KACGf,IAC0CM,EAAYQ,EAAUC,KAAUf,GAUlES,EAAc,CACzBK,EACAC,KACGf,IAC2CQ,EAAaM,EAAUC,KAAUf,GAgBpEa,EAAiBG,IAC5BJ,EAAeI,ICjDjB,MAAMC,EAAStB,WAAWuB,MAQpBrB,EAAWF,WAAWG,QAWfqB,EAAc,CAACC,EAAkBC,IAAyCxB,EAASI,UAAUgB,EAAQ,CAACG,EAASC,IC+C/GC,EArEC3B,WAAW4B,KAqEED,MC2BdE,EA7FE7B,WAAW8B,MCA1B,MAAMC,EAAW/B,WAAWgC,QACtB9B,EAAWF,WAAWG,eAiBE4B,EAASE,QAAQC,KAAKH,GAKvBA,EAASI,OAAOD,KAAKH,GAKxBA,EAASK,IAAIF,KAAKH,GAKjBA,EAASM,KAAKH,KAAKH,GAKbA,EAASO,WAAWJ,KAAKH,GAKhCA,EAASQ,IAAIL,KAAKH,GAOFA,EAAUS,eAAeN,KAAKH,iBCxClE,SAAsBU,EAAW,KACrC,IAAIC,EAAiC,KACjCC,EAA+C,GA0BnD,OAAOlC,EAAO,CAAEmC,MAxBF,KACI,OAAZF,IACFA,EAAU5B,EAAY,KACpB,MAAM+B,EAAczC,IACpBuC,EAAYG,QAASC,GAAeA,EAAWF,KAC9CJ,KAmBgBO,KAfV,KACK,OAAZN,IACFxB,EAAcwB,GACdA,EAAU,OAYeO,UARV9B,IACjBwB,EAAYO,KAAK/B,IAOqBgC,YAJnBhC,IACnBwB,EAAcA,EAAYS,OAAQL,GAAeA,IAAe5B,IAGbsB,YACvD,gBC/BM,SAAsBtB,EAAsBC,GAChD,IAAIiC,EAAiC,KACjCT,EAAuB,KACvBU,EAAoBlC,EAExB,MAAMmC,EAAQ,KACZ,GAAgB,OAAZF,EAAkB,CN0BxBtC,EMzBiBsC,GACb,MAAM7C,EAAMD,IAEE,OAAVqC,IACFU,GAAa9C,EAAMoC,GAErBS,EAAU,IACZ,GAGIG,EAAS,KACG,OAAZH,IACFT,EAAQrC,IACR8C,EAAUzC,EAAW,KACnBO,IACAkC,EAAU,MACTC,KAUP,OAAO7C,EAAO,CAAE8C,QAAOC,SAAQC,MANjB,CAACC,EAAmBtC,KAChCmC,IACAD,EAAYI,EACZF,MAIJ,8BC3CM,SAAoCG,EAAYC,GACpD,IAAKD,KAAUA,aAAgB1D,OAAS4B,EAAY8B,EAAKE,WACvD,MAAMrC,EAAY,sBAGpB,GAAIoC,GAAkB,EACpB,MAAMpC,EAAY,qCAGpB,MAAMsC,EAAWH,EAAKE,UAChBE,EAA8B,GAAjBH,EAAsB,IAEzC,OAAOxD,EADoBuB,EAAMmC,EAAWC,GAAcA,EAE5D,wBChBM,SAA8B5C,EAAsBsB,GACxD,MAAMY,EAAUvC,EAAYK,EAAUsB,GACtC,MAAO,IAAYvB,EAAcmC,EACnC,UCHM,SAAgBW,GACpB,OLeAC,EKfsBhC,GAAYrB,EAAWqB,EAAS+B,GLgB3B9D,EAASI,UAAUyB,EAAU,CAACkC,IAF9B,IAC3BA,CKdF"}
@@ -4,6 +4,92 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.HyperfrontendTimeUtils = {}));
5
5
  })(this, (function (exports) { 'use strict';
6
6
 
7
+ /**
8
+ * Safe copies of Date built-in via factory function and static methods.
9
+ *
10
+ * Since constructors cannot be safely captured via Object.assign, this module
11
+ * provides a factory function that uses Reflect.construct internally.
12
+ *
13
+ * These references are captured at module initialization time to protect against
14
+ * prototype pollution attacks. Import only what you need for tree-shaking.
15
+ *
16
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/date
17
+ */
18
+ // Capture references at module initialization time
19
+ const _Date = globalThis.Date;
20
+ const _Reflect$2 = globalThis.Reflect;
21
+ function createDate(...args) {
22
+ return _Reflect$2.construct(_Date, args);
23
+ }
24
+ /**
25
+ * (Safe copy) Returns the number of milliseconds elapsed since January 1, 1970 00:00:00 UTC.
26
+ */
27
+ const dateNow = _Date.now;
28
+
29
+ /**
30
+ * Safe copies of Object built-in methods.
31
+ *
32
+ * These references are captured at module initialization time to protect against
33
+ * prototype pollution attacks. Import only what you need for tree-shaking.
34
+ *
35
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/object
36
+ */
37
+ // Capture references at module initialization time
38
+ const _Object = globalThis.Object;
39
+ /**
40
+ * (Safe copy) Prevents modification of existing property attributes and values,
41
+ * and prevents the addition of new properties.
42
+ */
43
+ const freeze = _Object.freeze;
44
+
45
+ /**
46
+ * Safe copies of Timer/Scheduling built-in functions.
47
+ *
48
+ * These references are captured at module initialization time to protect against
49
+ * prototype pollution attacks. Import only what you need for tree-shaking.
50
+ *
51
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/timers
52
+ */
53
+ // Capture references at module initialization time
54
+ const _setTimeout = globalThis.setTimeout;
55
+ const _setInterval = globalThis.setInterval;
56
+ const _clearTimeout = globalThis.clearTimeout;
57
+ const _clearInterval = globalThis.clearInterval;
58
+ /**
59
+ * (Safe copy) Sets a timer which executes a function once the timer expires.
60
+ *
61
+ * @param callback - Function to call when the timer elapses.
62
+ * @param delay - Time in milliseconds before executing.
63
+ * @param args - Additional arguments to pass to the callback.
64
+ * @returns A numeric ID for the timer.
65
+ */
66
+ const setTimeout = (callback, delay, ...args) => _setTimeout(callback, delay, ...args);
67
+ /**
68
+ * (Safe copy) Repeatedly calls a function with a fixed time delay between each call.
69
+ *
70
+ * @param callback - Function to call at each interval.
71
+ * @param delay - Time in milliseconds between calls.
72
+ * @param args - Additional arguments to pass to the callback.
73
+ * @returns A numeric ID for the interval.
74
+ */
75
+ const setInterval = (callback, delay, ...args) => _setInterval(callback, delay, ...args);
76
+ /**
77
+ * (Safe copy) Cancels a timeout previously established by setTimeout.
78
+ *
79
+ * @param id - The identifier of the timeout to cancel.
80
+ */
81
+ const clearTimeout = (id) => {
82
+ _clearTimeout(id);
83
+ };
84
+ /**
85
+ * (Safe copy) Cancels a timed, repeating action previously established by setInterval.
86
+ *
87
+ * @param id - The identifier of the interval to cancel.
88
+ */
89
+ const clearInterval = (id) => {
90
+ _clearInterval(id);
91
+ };
92
+
7
93
  /**
8
94
  * Creates an interval loop that invokes one or more subscribed callback functions
9
95
  * at the specified internal (in milliseconds).
@@ -20,7 +106,7 @@
20
106
  const start = () => {
21
107
  if (clockId === null) {
22
108
  clockId = setInterval(() => {
23
- const currentTime = new Date();
109
+ const currentTime = createDate();
24
110
  subscribers.forEach((subscriber) => subscriber(currentTime));
25
111
  }, interval);
26
112
  }
@@ -37,7 +123,7 @@
37
123
  const unsubscribe = (callback) => {
38
124
  subscribers = subscribers.filter((subscriber) => subscriber !== callback);
39
125
  };
40
- return Object.freeze({ start, stop, subscribe, unsubscribe, interval });
126
+ return freeze({ start, stop, subscribe, unsubscribe, interval });
41
127
  }
42
128
 
43
129
  /**
@@ -55,7 +141,7 @@
55
141
  const pause = () => {
56
142
  if (timerId !== null) {
57
143
  clearTimeout(timerId);
58
- const now = Date.now();
144
+ const now = dateNow();
59
145
  /* istanbul ignore else - start is always set when timerId is not null */
60
146
  if (start !== null) {
61
147
  remaining -= now - start;
@@ -65,7 +151,7 @@
65
151
  };
66
152
  const resume = () => {
67
153
  if (timerId === null) {
68
- start = Date.now();
154
+ start = dateNow();
69
155
  timerId = setTimeout(() => {
70
156
  callback();
71
157
  timerId = null;
@@ -77,9 +163,66 @@
77
163
  remaining = newDelay;
78
164
  resume();
79
165
  };
80
- return Object.freeze({ pause, resume, reset });
166
+ return freeze({ pause, resume, reset });
81
167
  }
82
168
 
169
+ /**
170
+ * Safe copies of Error built-ins via factory functions.
171
+ *
172
+ * Since constructors cannot be safely captured via Object.assign, this module
173
+ * provides factory functions that use Reflect.construct internally.
174
+ *
175
+ * These references are captured at module initialization time to protect against
176
+ * prototype pollution attacks. Import only what you need for tree-shaking.
177
+ *
178
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/error
179
+ */
180
+ // Capture references at module initialization time
181
+ const _Error = globalThis.Error;
182
+ const _Reflect$1 = globalThis.Reflect;
183
+ /**
184
+ * (Safe copy) Creates a new Error using the captured Error constructor.
185
+ * Use this instead of `new Error()`.
186
+ *
187
+ * @param message - Optional error message.
188
+ * @param options - Optional error options.
189
+ * @returns A new Error instance.
190
+ */
191
+ const createError = (message, options) => _Reflect$1.construct(_Error, [message, options]);
192
+
193
+ /**
194
+ * Safe copies of Math built-in methods.
195
+ *
196
+ * These references are captured at module initialization time to protect against
197
+ * prototype pollution attacks. Import only what you need for tree-shaking.
198
+ *
199
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/math
200
+ */
201
+ // Capture references at module initialization time
202
+ const _Math = globalThis.Math;
203
+ /**
204
+ * (Safe copy) Returns the largest integer less than or equal to a number.
205
+ */
206
+ const floor = _Math.floor;
207
+
208
+ /**
209
+ * Safe copies of Number built-in methods and constants.
210
+ *
211
+ * These references are captured at module initialization time to protect against
212
+ * prototype pollution attacks. Import only what you need for tree-shaking.
213
+ *
214
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/number
215
+ */
216
+ // Capture references at module initialization time
217
+ const _isNaN = globalThis.isNaN;
218
+ // ============================================================================
219
+ // Global Type Checking (legacy, less strict)
220
+ // ============================================================================
221
+ /**
222
+ * (Safe copy) Global isNaN function (coerces to number first, less strict than Number.isNaN).
223
+ */
224
+ const globalIsNaN = _isNaN;
225
+
83
226
  /**
84
227
  * Normalizes a given time to the nearest base time window.
85
228
  *
@@ -88,16 +231,16 @@
88
231
  * @returns A new Date object normalized to the start of the time window
89
232
  */
90
233
  function normalizeToBaseTimeWindow(time, baseTimeWindow) {
91
- if (!time || !(time instanceof Date) || isNaN(time.getTime())) {
92
- throw new Error('Invalid time input');
234
+ if (!time || !(time instanceof Date) || globalIsNaN(time.getTime())) {
235
+ throw createError('Invalid time input');
93
236
  }
94
237
  if (baseTimeWindow <= 0) {
95
- throw new Error('Base time window must be positive');
238
+ throw createError('Base time window must be positive');
96
239
  }
97
240
  const timeInMs = time.getTime();
98
241
  const windowInMs = baseTimeWindow * 60 * 1000;
99
- const normalizedTimeInMs = Math.floor(timeInMs / windowInMs) * windowInMs;
100
- return new Date(normalizedTimeInMs);
242
+ const normalizedTimeInMs = floor(timeInMs / windowInMs) * windowInMs;
243
+ return createDate(normalizedTimeInMs);
101
244
  }
102
245
 
103
246
  /**
@@ -112,6 +255,59 @@
112
255
  return () => clearInterval(timerId);
113
256
  }
114
257
 
258
+ /**
259
+ * Safe copies of Promise built-in methods via factory functions.
260
+ *
261
+ * Since constructors cannot be safely captured via Object.assign, this module
262
+ * provides factory functions that use Reflect.construct internally.
263
+ *
264
+ * These references are captured at module initialization time to protect against
265
+ * prototype pollution attacks. Import only what you need for tree-shaking.
266
+ *
267
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/promise
268
+ */
269
+ // Capture references at module initialization time
270
+ const _Promise = globalThis.Promise;
271
+ const _Reflect = globalThis.Reflect;
272
+ /**
273
+ * (Safe copy) Creates a new Promise using the captured Promise constructor.
274
+ * Use this instead of `new Promise()`.
275
+ *
276
+ * @param executor - The executor function.
277
+ * @returns A new Promise instance.
278
+ */
279
+ const createPromise = (executor) => _Reflect.construct(_Promise, [executor]);
280
+ /**
281
+ * (Safe copy) Returns a Promise that resolves with the given value.
282
+ */
283
+ _Promise.resolve.bind(_Promise);
284
+ /**
285
+ * (Safe copy) Returns a Promise that rejects with the given reason.
286
+ */
287
+ _Promise.reject.bind(_Promise);
288
+ /**
289
+ * (Safe copy) Returns a Promise that resolves when all promises resolve.
290
+ */
291
+ _Promise.all.bind(_Promise);
292
+ /**
293
+ * (Safe copy) Returns a Promise that resolves/rejects with the first settled promise.
294
+ */
295
+ _Promise.race.bind(_Promise);
296
+ /**
297
+ * (Safe copy) Returns a Promise that resolves when all promises settle.
298
+ */
299
+ _Promise.allSettled.bind(_Promise);
300
+ /**
301
+ * (Safe copy) Returns a Promise that resolves with the first fulfilled promise.
302
+ */
303
+ _Promise.any.bind(_Promise);
304
+ /**
305
+ * (Safe copy) Creates a Promise along with its resolve and reject functions.
306
+ * Note: Available only in ES2024+ environments.
307
+ */
308
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
309
+ _Promise.withResolvers?.bind(_Promise);
310
+
115
311
  /**
116
312
  * Pauses execution for a specified duration.
117
313
  *
@@ -119,7 +315,7 @@
119
315
  * @returns A promise that resolves after the specified duration
120
316
  */
121
317
  function sleep(milliseconds) {
122
- return new Promise((resolve) => setTimeout(resolve, milliseconds));
318
+ return createPromise((resolve) => setTimeout(resolve, milliseconds));
123
319
  }
124
320
 
125
321
  exports.createClock = createClock;