@develia/commons 0.4.24 → 0.4.26
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/dist/array.d.ts.map +1 -0
- package/dist/array.js.map +1 -0
- package/dist/async-pool-executor.d.ts.map +1 -0
- package/dist/async-pool-executor.js.map +1 -0
- package/dist/browser/form-utilities.d.ts.map +1 -0
- package/dist/browser/form-utilities.js.map +1 -0
- package/dist/browser/geo-location.d.ts.map +1 -0
- package/dist/browser/geo-location.js.map +1 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/native-bridge.d.ts.map +1 -0
- package/dist/browser/native-bridge.js.map +1 -0
- package/dist/cancellable-promise.d.ts.map +1 -0
- package/dist/cancellable-promise.js.map +1 -0
- package/dist/clean-url-search-params.d.ts.map +1 -0
- package/dist/clean-url-search-params.js.map +1 -0
- package/dist/collections/cache-dictionary.d.ts.map +1 -0
- package/dist/collections/cache-dictionary.js.map +1 -0
- package/dist/collections/default-map.d.ts.map +1 -0
- package/dist/collections/default-map.js.map +1 -0
- package/dist/collections/default-weak-map.d.ts.map +1 -0
- package/dist/collections/default-weak-map.js.map +1 -0
- package/dist/{types/collections → collections}/from.d.ts +15 -6
- package/dist/collections/from.d.ts.map +1 -0
- package/dist/{esm/collections → collections}/from.js +4 -10
- package/dist/collections/from.js.map +1 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/debouncer.d.ts.map +1 -0
- package/dist/debouncer.js.map +1 -0
- package/dist/draft.d.ts.map +1 -0
- package/dist/draft.js.map +1 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/functions.d.ts.map +1 -0
- package/dist/functions.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/key-value-pair.d.ts.map +1 -0
- package/dist/key-value-pair.js.map +1 -0
- package/dist/keyed-debouncer.d.ts.map +1 -0
- package/dist/keyed-debouncer.js.map +1 -0
- package/dist/lazy.d.ts.map +1 -0
- package/dist/lazy.js.map +1 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js.map +1 -0
- package/dist/order.d.ts.map +1 -0
- package/dist/order.js.map +1 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js.map +1 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js.map +1 -0
- package/dist/range.d.ts.map +1 -0
- package/dist/range.js.map +1 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js.map +1 -0
- package/dist/stopwatch.d.ts.map +1 -0
- package/dist/stopwatch.js.map +1 -0
- package/dist/string.d.ts.map +1 -0
- package/dist/string.js.map +1 -0
- package/dist/timer.d.ts.map +1 -0
- package/dist/timer.js.map +1 -0
- package/dist/timespan.d.ts.map +1 -0
- package/dist/timespan.js.map +1 -0
- package/dist/triggers.d.ts.map +1 -0
- package/dist/triggers.js.map +1 -0
- package/dist/type-code.d.ts.map +1 -0
- package/dist/type-code.js.map +1 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/type.js.map +1 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js.map +1 -0
- package/dist/{types/utilities.d.ts → utilities.d.ts} +4 -3
- package/dist/utilities.d.ts.map +1 -0
- package/dist/{web/utilities.js → utilities.js} +4 -3
- package/dist/utilities.js.map +1 -0
- package/package.json +13 -62
- package/src/collections/from.ts +21 -11
- package/src/utilities.ts +5 -4
- package/dist/cjs/array.js +0 -106
- package/dist/cjs/array.js.map +0 -1
- package/dist/cjs/async-pool-executor.js +0 -79
- package/dist/cjs/async-pool-executor.js.map +0 -1
- package/dist/cjs/browser/form-utilities.js +0 -162
- package/dist/cjs/browser/form-utilities.js.map +0 -1
- package/dist/cjs/browser/geo-location.js +0 -78
- package/dist/cjs/browser/geo-location.js.map +0 -1
- package/dist/cjs/browser/index.js +0 -99
- package/dist/cjs/browser/index.js.map +0 -1
- package/dist/cjs/browser/native-bridge.js +0 -81
- package/dist/cjs/browser/native-bridge.js.map +0 -1
- package/dist/cjs/cancellable-promise.js +0 -81
- package/dist/cjs/cancellable-promise.js.map +0 -1
- package/dist/cjs/clean-url-search-params.js +0 -34
- package/dist/cjs/clean-url-search-params.js.map +0 -1
- package/dist/cjs/collections/cache-dictionary.js +0 -102
- package/dist/cjs/collections/cache-dictionary.js.map +0 -1
- package/dist/cjs/collections/default-map.js +0 -45
- package/dist/cjs/collections/default-map.js.map +0 -1
- package/dist/cjs/collections/default-weak-map.js +0 -46
- package/dist/cjs/collections/default-weak-map.js.map +0 -1
- package/dist/cjs/collections/from.js +0 -778
- package/dist/cjs/collections/from.js.map +0 -1
- package/dist/cjs/collections/index.js +0 -15
- package/dist/cjs/collections/index.js.map +0 -1
- package/dist/cjs/debouncer.js +0 -121
- package/dist/cjs/debouncer.js.map +0 -1
- package/dist/cjs/draft.js +0 -225
- package/dist/cjs/draft.js.map +0 -1
- package/dist/cjs/event-bus.js +0 -71
- package/dist/cjs/event-bus.js.map +0 -1
- package/dist/cjs/functions.js +0 -262
- package/dist/cjs/functions.js.map +0 -1
- package/dist/cjs/index.js +0 -84
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/key-value-pair.js +0 -22
- package/dist/cjs/key-value-pair.js.map +0 -1
- package/dist/cjs/keyed-debouncer.js +0 -144
- package/dist/cjs/keyed-debouncer.js.map +0 -1
- package/dist/cjs/lazy.js +0 -29
- package/dist/cjs/lazy.js.map +0 -1
- package/dist/cjs/math.js +0 -37
- package/dist/cjs/math.js.map +0 -1
- package/dist/cjs/order.js +0 -9
- package/dist/cjs/order.js.map +0 -1
- package/dist/cjs/parse.js +0 -174
- package/dist/cjs/parse.js.map +0 -1
- package/dist/cjs/patch.js +0 -52
- package/dist/cjs/patch.js.map +0 -1
- package/dist/cjs/range.js +0 -154
- package/dist/cjs/range.js.map +0 -1
- package/dist/cjs/result.js +0 -3
- package/dist/cjs/result.js.map +0 -1
- package/dist/cjs/stopwatch.js +0 -46
- package/dist/cjs/stopwatch.js.map +0 -1
- package/dist/cjs/string.js +0 -154
- package/dist/cjs/string.js.map +0 -1
- package/dist/cjs/timer.js +0 -57
- package/dist/cjs/timer.js.map +0 -1
- package/dist/cjs/timespan.js +0 -367
- package/dist/cjs/timespan.js.map +0 -1
- package/dist/cjs/triggers.js +0 -103
- package/dist/cjs/triggers.js.map +0 -1
- package/dist/cjs/type-code.js +0 -18
- package/dist/cjs/type-code.js.map +0 -1
- package/dist/cjs/type.js +0 -296
- package/dist/cjs/type.js.map +0 -1
- package/dist/cjs/types.js +0 -3
- package/dist/cjs/types.js.map +0 -1
- package/dist/cjs/utilities.js +0 -621
- package/dist/cjs/utilities.js.map +0 -1
- package/dist/esm/array.js.map +0 -1
- package/dist/esm/async-pool-executor.js.map +0 -1
- package/dist/esm/browser/form-utilities.js.map +0 -1
- package/dist/esm/browser/geo-location.js.map +0 -1
- package/dist/esm/browser/index.js.map +0 -1
- package/dist/esm/browser/native-bridge.js.map +0 -1
- package/dist/esm/cancellable-promise.js.map +0 -1
- package/dist/esm/clean-url-search-params.js.map +0 -1
- package/dist/esm/collections/cache-dictionary.js.map +0 -1
- package/dist/esm/collections/default-map.js.map +0 -1
- package/dist/esm/collections/default-weak-map.js.map +0 -1
- package/dist/esm/collections/from.js.map +0 -1
- package/dist/esm/collections/index.js.map +0 -1
- package/dist/esm/debouncer.js.map +0 -1
- package/dist/esm/draft.js.map +0 -1
- package/dist/esm/event-bus.js.map +0 -1
- package/dist/esm/functions.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/key-value-pair.js.map +0 -1
- package/dist/esm/keyed-debouncer.js.map +0 -1
- package/dist/esm/lazy.js.map +0 -1
- package/dist/esm/math.js.map +0 -1
- package/dist/esm/order.js.map +0 -1
- package/dist/esm/parse.js.map +0 -1
- package/dist/esm/patch.js.map +0 -1
- package/dist/esm/range.js.map +0 -1
- package/dist/esm/result.js.map +0 -1
- package/dist/esm/stopwatch.js.map +0 -1
- package/dist/esm/string.js.map +0 -1
- package/dist/esm/timer.js.map +0 -1
- package/dist/esm/timespan.js.map +0 -1
- package/dist/esm/triggers.js.map +0 -1
- package/dist/esm/type-code.js.map +0 -1
- package/dist/esm/type.js.map +0 -1
- package/dist/esm/types.js.map +0 -1
- package/dist/esm/utilities.js +0 -590
- package/dist/esm/utilities.js.map +0 -1
- package/dist/types/array.d.ts.map +0 -1
- package/dist/types/async-pool-executor.d.ts.map +0 -1
- package/dist/types/browser/form-utilities.d.ts.map +0 -1
- package/dist/types/browser/geo-location.d.ts.map +0 -1
- package/dist/types/browser/index.d.ts.map +0 -1
- package/dist/types/browser/native-bridge.d.ts.map +0 -1
- package/dist/types/cancellable-promise.d.ts.map +0 -1
- package/dist/types/clean-url-search-params.d.ts.map +0 -1
- package/dist/types/collections/cache-dictionary.d.ts.map +0 -1
- package/dist/types/collections/default-map.d.ts.map +0 -1
- package/dist/types/collections/default-weak-map.d.ts.map +0 -1
- package/dist/types/collections/from.d.ts.map +0 -1
- package/dist/types/collections/index.d.ts.map +0 -1
- package/dist/types/debouncer.d.ts.map +0 -1
- package/dist/types/draft.d.ts.map +0 -1
- package/dist/types/event-bus.d.ts.map +0 -1
- package/dist/types/functions.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/key-value-pair.d.ts.map +0 -1
- package/dist/types/keyed-debouncer.d.ts.map +0 -1
- package/dist/types/lazy.d.ts.map +0 -1
- package/dist/types/math.d.ts.map +0 -1
- package/dist/types/order.d.ts.map +0 -1
- package/dist/types/parse.d.ts.map +0 -1
- package/dist/types/patch.d.ts.map +0 -1
- package/dist/types/range.d.ts.map +0 -1
- package/dist/types/result.d.ts.map +0 -1
- package/dist/types/stopwatch.d.ts.map +0 -1
- package/dist/types/string.d.ts.map +0 -1
- package/dist/types/timer.d.ts.map +0 -1
- package/dist/types/timespan.d.ts.map +0 -1
- package/dist/types/triggers.d.ts.map +0 -1
- package/dist/types/type-code.d.ts.map +0 -1
- package/dist/types/type.d.ts.map +0 -1
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/utilities.d.ts.map +0 -1
- package/dist/web/array.js +0 -98
- package/dist/web/array.js.map +0 -1
- package/dist/web/async-pool-executor.js +0 -76
- package/dist/web/async-pool-executor.js.map +0 -1
- package/dist/web/browser/form-utilities.js +0 -155
- package/dist/web/browser/form-utilities.js.map +0 -1
- package/dist/web/browser/geo-location.js +0 -75
- package/dist/web/browser/geo-location.js.map +0 -1
- package/dist/web/browser/index.js +0 -75
- package/dist/web/browser/index.js.map +0 -1
- package/dist/web/browser/native-bridge.js +0 -78
- package/dist/web/browser/native-bridge.js.map +0 -1
- package/dist/web/cancellable-promise.js +0 -78
- package/dist/web/cancellable-promise.js.map +0 -1
- package/dist/web/clean-url-search-params.js +0 -31
- package/dist/web/clean-url-search-params.js.map +0 -1
- package/dist/web/collections/cache-dictionary.js +0 -99
- package/dist/web/collections/cache-dictionary.js.map +0 -1
- package/dist/web/collections/default-map.js +0 -42
- package/dist/web/collections/default-map.js.map +0 -1
- package/dist/web/collections/default-weak-map.js +0 -43
- package/dist/web/collections/default-weak-map.js.map +0 -1
- package/dist/web/collections/from.js +0 -770
- package/dist/web/collections/from.js.map +0 -1
- package/dist/web/collections/index.js +0 -5
- package/dist/web/collections/index.js.map +0 -1
- package/dist/web/debouncer.js +0 -118
- package/dist/web/debouncer.js.map +0 -1
- package/dist/web/draft.js +0 -222
- package/dist/web/draft.js.map +0 -1
- package/dist/web/event-bus.js +0 -66
- package/dist/web/event-bus.js.map +0 -1
- package/dist/web/functions.js +0 -251
- package/dist/web/functions.js.map +0 -1
- package/dist/web/index.js +0 -40
- package/dist/web/index.js.map +0 -1
- package/dist/web/key-value-pair.js +0 -19
- package/dist/web/key-value-pair.js.map +0 -1
- package/dist/web/keyed-debouncer.js +0 -109
- package/dist/web/keyed-debouncer.js.map +0 -1
- package/dist/web/lazy.js +0 -26
- package/dist/web/lazy.js.map +0 -1
- package/dist/web/math.js +0 -33
- package/dist/web/math.js.map +0 -1
- package/dist/web/order.js +0 -7
- package/dist/web/order.js.map +0 -1
- package/dist/web/parse.js +0 -169
- package/dist/web/parse.js.map +0 -1
- package/dist/web/patch.js +0 -48
- package/dist/web/patch.js.map +0 -1
- package/dist/web/range.js +0 -151
- package/dist/web/range.js.map +0 -1
- package/dist/web/result.js +0 -2
- package/dist/web/result.js.map +0 -1
- package/dist/web/stopwatch.js +0 -40
- package/dist/web/stopwatch.js.map +0 -1
- package/dist/web/string.js +0 -142
- package/dist/web/string.js.map +0 -1
- package/dist/web/timer.js +0 -54
- package/dist/web/timer.js.map +0 -1
- package/dist/web/timespan.js +0 -365
- package/dist/web/timespan.js.map +0 -1
- package/dist/web/triggers.js +0 -99
- package/dist/web/triggers.js.map +0 -1
- package/dist/web/type-code.js +0 -16
- package/dist/web/type-code.js.map +0 -1
- package/dist/web/type.js +0 -292
- package/dist/web/type.js.map +0 -1
- package/dist/web/types.js +0 -2
- package/dist/web/types.js.map +0 -1
- package/dist/web/utilities.js.map +0 -1
- /package/dist/{types/array.d.ts → array.d.ts} +0 -0
- /package/dist/{esm/array.js → array.js} +0 -0
- /package/dist/{types/async-pool-executor.d.ts → async-pool-executor.d.ts} +0 -0
- /package/dist/{esm/async-pool-executor.js → async-pool-executor.js} +0 -0
- /package/dist/{types/browser → browser}/form-utilities.d.ts +0 -0
- /package/dist/{esm/browser → browser}/form-utilities.js +0 -0
- /package/dist/{types/browser → browser}/geo-location.d.ts +0 -0
- /package/dist/{esm/browser → browser}/geo-location.js +0 -0
- /package/dist/{types/browser → browser}/index.d.ts +0 -0
- /package/dist/{esm/browser → browser}/index.js +0 -0
- /package/dist/{types/browser → browser}/native-bridge.d.ts +0 -0
- /package/dist/{esm/browser → browser}/native-bridge.js +0 -0
- /package/dist/{types/cancellable-promise.d.ts → cancellable-promise.d.ts} +0 -0
- /package/dist/{esm/cancellable-promise.js → cancellable-promise.js} +0 -0
- /package/dist/{types/clean-url-search-params.d.ts → clean-url-search-params.d.ts} +0 -0
- /package/dist/{esm/clean-url-search-params.js → clean-url-search-params.js} +0 -0
- /package/dist/{types/collections → collections}/cache-dictionary.d.ts +0 -0
- /package/dist/{esm/collections → collections}/cache-dictionary.js +0 -0
- /package/dist/{types/collections → collections}/default-map.d.ts +0 -0
- /package/dist/{esm/collections → collections}/default-map.js +0 -0
- /package/dist/{types/collections → collections}/default-weak-map.d.ts +0 -0
- /package/dist/{esm/collections → collections}/default-weak-map.js +0 -0
- /package/dist/{types/collections → collections}/index.d.ts +0 -0
- /package/dist/{esm/collections → collections}/index.js +0 -0
- /package/dist/{types/debouncer.d.ts → debouncer.d.ts} +0 -0
- /package/dist/{esm/debouncer.js → debouncer.js} +0 -0
- /package/dist/{types/draft.d.ts → draft.d.ts} +0 -0
- /package/dist/{esm/draft.js → draft.js} +0 -0
- /package/dist/{types/event-bus.d.ts → event-bus.d.ts} +0 -0
- /package/dist/{esm/event-bus.js → event-bus.js} +0 -0
- /package/dist/{types/functions.d.ts → functions.d.ts} +0 -0
- /package/dist/{esm/functions.js → functions.js} +0 -0
- /package/dist/{types/index.d.ts → index.d.ts} +0 -0
- /package/dist/{esm/index.js → index.js} +0 -0
- /package/dist/{types/key-value-pair.d.ts → key-value-pair.d.ts} +0 -0
- /package/dist/{esm/key-value-pair.js → key-value-pair.js} +0 -0
- /package/dist/{types/keyed-debouncer.d.ts → keyed-debouncer.d.ts} +0 -0
- /package/dist/{esm/keyed-debouncer.js → keyed-debouncer.js} +0 -0
- /package/dist/{types/lazy.d.ts → lazy.d.ts} +0 -0
- /package/dist/{esm/lazy.js → lazy.js} +0 -0
- /package/dist/{types/math.d.ts → math.d.ts} +0 -0
- /package/dist/{esm/math.js → math.js} +0 -0
- /package/dist/{types/order.d.ts → order.d.ts} +0 -0
- /package/dist/{esm/order.js → order.js} +0 -0
- /package/dist/{types/parse.d.ts → parse.d.ts} +0 -0
- /package/dist/{esm/parse.js → parse.js} +0 -0
- /package/dist/{types/patch.d.ts → patch.d.ts} +0 -0
- /package/dist/{esm/patch.js → patch.js} +0 -0
- /package/dist/{types/range.d.ts → range.d.ts} +0 -0
- /package/dist/{esm/range.js → range.js} +0 -0
- /package/dist/{types/result.d.ts → result.d.ts} +0 -0
- /package/dist/{esm/result.js → result.js} +0 -0
- /package/dist/{types/stopwatch.d.ts → stopwatch.d.ts} +0 -0
- /package/dist/{esm/stopwatch.js → stopwatch.js} +0 -0
- /package/dist/{types/string.d.ts → string.d.ts} +0 -0
- /package/dist/{esm/string.js → string.js} +0 -0
- /package/dist/{types/timer.d.ts → timer.d.ts} +0 -0
- /package/dist/{esm/timer.js → timer.js} +0 -0
- /package/dist/{types/timespan.d.ts → timespan.d.ts} +0 -0
- /package/dist/{esm/timespan.js → timespan.js} +0 -0
- /package/dist/{types/triggers.d.ts → triggers.d.ts} +0 -0
- /package/dist/{esm/triggers.js → triggers.js} +0 -0
- /package/dist/{types/type-code.d.ts → type-code.d.ts} +0 -0
- /package/dist/{esm/type-code.js → type-code.js} +0 -0
- /package/dist/{types/type.d.ts → type.d.ts} +0 -0
- /package/dist/{esm/type.js → type.js} +0 -0
- /package/dist/{types/types.d.ts → types.d.ts} +0 -0
- /package/dist/{esm/types.js → types.js} +0 -0
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
// ─── Tipos ───────────────────────────────────────────────
|
|
2
|
-
// ─── Helpers ─────────────────────────────────────────────
|
|
3
|
-
function positionToGeoLocation(position) {
|
|
4
|
-
const { coords, timestamp } = position;
|
|
5
|
-
return {
|
|
6
|
-
latitude: coords.latitude,
|
|
7
|
-
longitude: coords.longitude,
|
|
8
|
-
accuracy: coords.accuracy,
|
|
9
|
-
altitude: coords.altitude,
|
|
10
|
-
altitudeAccuracy: coords.altitudeAccuracy,
|
|
11
|
-
heading: coords.heading,
|
|
12
|
-
speed: coords.speed,
|
|
13
|
-
timestamp,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
function geolocationError(error) {
|
|
17
|
-
switch (error.code) {
|
|
18
|
-
case error.PERMISSION_DENIED:
|
|
19
|
-
return new Error('Has denegado el permiso de ubicación.');
|
|
20
|
-
case error.POSITION_UNAVAILABLE:
|
|
21
|
-
return new Error('No se pudo determinar tu ubicación.');
|
|
22
|
-
case error.TIMEOUT:
|
|
23
|
-
return new Error('Tiempo de espera agotado al obtener la ubicación.');
|
|
24
|
-
default:
|
|
25
|
-
return new Error('Error desconocido al obtener la ubicación.');
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
function requestPosition(options) {
|
|
29
|
-
return new Promise((resolve, reject) => {
|
|
30
|
-
navigator.geolocation.getCurrentPosition((position) => resolve(positionToGeoLocation(position)), (error) => reject(geolocationError(error)), options);
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
async function ensurePermission() {
|
|
34
|
-
if (!navigator.permissions)
|
|
35
|
-
return;
|
|
36
|
-
const permission = await navigator.permissions.query({ name: 'geolocation' });
|
|
37
|
-
if (permission.state === 'denied') {
|
|
38
|
-
throw new Error('Permiso de ubicación denegado. Actívalo en la configuración del navegador.');
|
|
39
|
-
}
|
|
40
|
-
if (permission.state === 'prompt') {
|
|
41
|
-
await new Promise((resolve, reject) => {
|
|
42
|
-
// Escuchar cambio de estado del permiso
|
|
43
|
-
permission.onchange = () => {
|
|
44
|
-
permission.onchange = null;
|
|
45
|
-
if (permission.state === 'granted') {
|
|
46
|
-
resolve();
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
reject(new Error('Has denegado el permiso de ubicación.'));
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
// Forzar el diálogo nativo del navegador
|
|
53
|
-
navigator.geolocation.getCurrentPosition(() => {
|
|
54
|
-
permission.onchange = null;
|
|
55
|
-
resolve();
|
|
56
|
-
}, (error) => {
|
|
57
|
-
permission.onchange = null;
|
|
58
|
-
reject(geolocationError(error));
|
|
59
|
-
}, { timeout: 30000 });
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// ─── Función principal ──────────────────────────────────
|
|
64
|
-
export default async function getGeoLocation(options = {}) {
|
|
65
|
-
if (typeof navigator === 'undefined' || !navigator.geolocation) {
|
|
66
|
-
throw new Error('Tu navegador no soporta geolocalización.');
|
|
67
|
-
}
|
|
68
|
-
await ensurePermission();
|
|
69
|
-
return requestPosition({
|
|
70
|
-
enableHighAccuracy: options.enableHighAccuracy ?? true,
|
|
71
|
-
timeout: options.timeout ?? 10000,
|
|
72
|
-
maximumAge: options.maximumAge ?? 0,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=geo-location.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geo-location.js","sourceRoot":"","sources":["../../../src/browser/geo-location.ts"],"names":[],"mappings":"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","sourcesContent":["// ─── Tipos ───────────────────────────────────────────────\n\nexport interface GeoLocation {\n latitude: number;\n longitude: number;\n accuracy: number;\n altitude: number | null;\n altitudeAccuracy: number | null;\n heading: number | null;\n speed: number | null;\n timestamp: number;\n}\n\nexport interface GeoLocationOptions {\n enableHighAccuracy?: boolean;\n timeout?: number;\n maximumAge?: number;\n}\n\n// ─── Helpers ─────────────────────────────────────────────\n\nfunction positionToGeoLocation(position: GeolocationPosition): GeoLocation {\n const {coords, timestamp} = position;\n return {\n latitude: coords.latitude,\n longitude: coords.longitude,\n accuracy: coords.accuracy,\n altitude: coords.altitude,\n altitudeAccuracy: coords.altitudeAccuracy,\n heading: coords.heading,\n speed: coords.speed,\n timestamp,\n };\n}\n\nfunction geolocationError(error: GeolocationPositionError): Error {\n switch (error.code) {\n case error.PERMISSION_DENIED:\n return new Error('Has denegado el permiso de ubicación.');\n case error.POSITION_UNAVAILABLE:\n return new Error('No se pudo determinar tu ubicación.');\n case error.TIMEOUT:\n return new Error('Tiempo de espera agotado al obtener la ubicación.');\n default:\n return new Error('Error desconocido al obtener la ubicación.');\n }\n}\n\nfunction requestPosition(options: PositionOptions): Promise<GeoLocation> {\n return new Promise((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(\n (position) => resolve(positionToGeoLocation(position)),\n (error) => reject(geolocationError(error)),\n options,\n );\n });\n}\n\nasync function ensurePermission(): Promise<void> {\n if (!navigator.permissions) return;\n\n const permission = await navigator.permissions.query({name: 'geolocation'});\n\n if (permission.state === 'denied') {\n throw new Error(\n 'Permiso de ubicación denegado. Actívalo en la configuración del navegador.',\n );\n }\n\n if (permission.state === 'prompt') {\n await new Promise<void>((resolve, reject) => {\n // Escuchar cambio de estado del permiso\n permission.onchange = () => {\n permission.onchange = null;\n if (permission.state === 'granted') {\n resolve();\n } else {\n reject(new Error('Has denegado el permiso de ubicación.'));\n }\n };\n\n // Forzar el diálogo nativo del navegador\n navigator.geolocation.getCurrentPosition(\n () => {\n permission.onchange = null;\n resolve();\n },\n (error) => {\n permission.onchange = null;\n reject(geolocationError(error));\n },\n {timeout: 30000},\n );\n });\n }\n}\n\n// ─── Función principal ──────────────────────────────────\n\nexport default async function getGeoLocation(\n options: GeoLocationOptions = {},\n): Promise<GeoLocation> {\n if (typeof navigator === 'undefined' || !navigator.geolocation) {\n throw new Error('Tu navegador no soporta geolocalización.');\n }\n\n await ensurePermission();\n\n return requestPosition({\n enableHighAccuracy: options.enableHighAccuracy ?? true,\n timeout: options.timeout ?? 10000,\n maximumAge: options.maximumAge ?? 0,\n });\n}"]}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { delay } from "../utilities.js";
|
|
2
|
-
export async function waitFor(selector, options = {}) {
|
|
3
|
-
const { timeout = 5000 } = options;
|
|
4
|
-
const element = document.querySelector(selector);
|
|
5
|
-
if (element) {
|
|
6
|
-
return element;
|
|
7
|
-
}
|
|
8
|
-
let observer;
|
|
9
|
-
const timeoutPromise = delay(timeout).then(() => {
|
|
10
|
-
observer?.disconnect();
|
|
11
|
-
return null;
|
|
12
|
-
});
|
|
13
|
-
const observerPromise = new Promise((resolve) => {
|
|
14
|
-
observer = new MutationObserver(() => {
|
|
15
|
-
const element = document.querySelector(selector);
|
|
16
|
-
if (element) {
|
|
17
|
-
observer?.disconnect();
|
|
18
|
-
resolve(element);
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
observer.observe(document.body, {
|
|
22
|
-
childList: true,
|
|
23
|
-
subtree: true,
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
return Promise.race([observerPromise, timeoutPromise]);
|
|
27
|
-
}
|
|
28
|
-
export async function fetchInto(selector, options = {}) {
|
|
29
|
-
const { url = window.location.href, fetchOptions = {}, runScripts = false, transition = null, } = options;
|
|
30
|
-
const response = await fetch(url, fetchOptions);
|
|
31
|
-
if (!response.ok) {
|
|
32
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
33
|
-
}
|
|
34
|
-
const html = await response.text();
|
|
35
|
-
const doc = new DOMParser().parseFromString(html, "text/html");
|
|
36
|
-
const oldElements = document.querySelectorAll(selector);
|
|
37
|
-
let replacedCount = 0;
|
|
38
|
-
for (let i = 0; i < oldElements.length; i++) {
|
|
39
|
-
const oldEl = oldElements[i];
|
|
40
|
-
const newEl = doc.querySelector(selector);
|
|
41
|
-
if (!newEl)
|
|
42
|
-
continue;
|
|
43
|
-
if (transition) {
|
|
44
|
-
oldEl.classList.add(transition);
|
|
45
|
-
await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())));
|
|
46
|
-
}
|
|
47
|
-
oldEl.replaceWith(newEl.cloneNode(true));
|
|
48
|
-
if (runScripts) {
|
|
49
|
-
const scripts = newEl.querySelectorAll("script");
|
|
50
|
-
for (let j = 0; j < scripts.length; j++) {
|
|
51
|
-
const script = scripts[j];
|
|
52
|
-
const fresh = document.createElement("script");
|
|
53
|
-
if (script.src) {
|
|
54
|
-
fresh.src = script.src;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
fresh.textContent = script.textContent;
|
|
58
|
-
}
|
|
59
|
-
const attrs = script.attributes;
|
|
60
|
-
for (let k = 0; k < attrs.length; k++) {
|
|
61
|
-
if (attrs[k].name !== "src") {
|
|
62
|
-
fresh.setAttribute(attrs[k].name, attrs[k].value);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
script.replaceWith(fresh);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
replacedCount++;
|
|
69
|
-
}
|
|
70
|
-
return replacedCount;
|
|
71
|
-
}
|
|
72
|
-
export * from './form-utilities.js';
|
|
73
|
-
export { default as NativeBridge } from "./native-bridge.js";
|
|
74
|
-
export { default as getGeoLocation } from './geo-location.js';
|
|
75
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/browser/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {delay} from \"../utilities.js\";\n\ninterface FetchIntoOptions {\n url?: string;\n fetchOptions?: RequestInit;\n runScripts?: boolean;\n transition?: string;\n}\n\nexport async function waitFor(\n selector: string,\n options: { timeout?: number } = {}\n): Promise<HTMLElement | null> {\n const {timeout = 5000} = options;\n\n const element = document.querySelector(selector);\n if (element) {\n return element as HTMLElement;\n }\n\n let observer: MutationObserver | undefined;\n const timeoutPromise = delay(timeout).then(() => {\n observer?.disconnect();\n return null;\n });\n\n const observerPromise = new Promise<HTMLElement | null>((resolve) => {\n observer = new MutationObserver(() => {\n const element = document.querySelector(selector);\n if (element) {\n observer?.disconnect();\n resolve(element as HTMLElement);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n });\n\n return Promise.race([observerPromise, timeoutPromise]);\n}\n\nexport async function fetchInto(\n selector: string,\n options: FetchIntoOptions = {}\n): Promise<number> {\n const {\n url = window.location.href,\n fetchOptions = {},\n runScripts = false,\n transition = null,\n } = options;\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const html = await response.text();\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n const oldElements = document.querySelectorAll(selector);\n let replacedCount = 0;\n\n for (let i = 0; i < oldElements.length; i++) {\n const oldEl = oldElements[i];\n const newEl = doc.querySelector(selector);\n\n if (!newEl) continue;\n\n if (transition) {\n oldEl.classList.add(transition);\n await new Promise<void>((r) =>\n requestAnimationFrame(() => requestAnimationFrame(() => r()))\n );\n }\n\n oldEl.replaceWith(newEl.cloneNode(true));\n\n if (runScripts) {\n const scripts = newEl.querySelectorAll(\"script\");\n\n for (let j = 0; j < scripts.length; j++) {\n const script = scripts[j];\n const fresh = document.createElement(\"script\");\n\n if (script.src) {\n fresh.src = script.src;\n } else {\n fresh.textContent = script.textContent;\n }\n\n const attrs = script.attributes;\n for (let k = 0; k < attrs.length; k++) {\n if (attrs[k].name !== \"src\") {\n fresh.setAttribute(attrs[k].name, attrs[k].value);\n }\n }\n\n script.replaceWith(fresh);\n }\n }\n\n replacedCount++;\n }\n\n return replacedCount;\n}\n\nexport * from './form-utilities.js';\n\nexport {default as NativeBridge} from \"./native-bridge.js\";\n\nexport {default as getGeoLocation} from './geo-location.js';"]}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
// ─── Clase ──────────────────────────────────────────────
|
|
2
|
-
export default class NativeBridge {
|
|
3
|
-
constructor({ channel, timeout = 3000, callbackName = '__nativeResponseHandler' }) {
|
|
4
|
-
this._pending = new Map();
|
|
5
|
-
this._callId = 0;
|
|
6
|
-
this._defaultTimeout = timeout;
|
|
7
|
-
this._channel = channel;
|
|
8
|
-
if (!this._channel) {
|
|
9
|
-
throw new Error('Channel not found');
|
|
10
|
-
}
|
|
11
|
-
window[callbackName] = (id, error, result) => {
|
|
12
|
-
this._callback(id, error, result);
|
|
13
|
-
};
|
|
14
|
-
// Proxy: cualquier propiedad no existente se convierte en call()
|
|
15
|
-
return new Proxy(this, {
|
|
16
|
-
get(target, prop) {
|
|
17
|
-
if (prop in target) {
|
|
18
|
-
return target[prop];
|
|
19
|
-
}
|
|
20
|
-
return (data, timeout) => target.call(String(prop), data, timeout);
|
|
21
|
-
},
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
_callback(id, error, result) {
|
|
25
|
-
const pending = this._pending.get(id);
|
|
26
|
-
if (!pending) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
if (pending.timer !== null) {
|
|
30
|
-
clearTimeout(pending.timer);
|
|
31
|
-
}
|
|
32
|
-
this._pending.delete(id);
|
|
33
|
-
if (error) {
|
|
34
|
-
pending.reject(error instanceof Error ? error : new Error(String(error)));
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
pending.resolve(result);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
call(method, data = null, timeout) {
|
|
41
|
-
const effectiveTimeout = timeout !== undefined ? timeout : this._defaultTimeout;
|
|
42
|
-
return new Promise((resolve, reject) => {
|
|
43
|
-
const id = this._callId++;
|
|
44
|
-
let timer = null;
|
|
45
|
-
// Solo crear timer si hay timeout
|
|
46
|
-
if (effectiveTimeout !== null && effectiveTimeout > 0) {
|
|
47
|
-
timer = setTimeout(() => {
|
|
48
|
-
this._pending.delete(id);
|
|
49
|
-
reject(new Error(`Timeout (${effectiveTimeout}ms): ${method}`));
|
|
50
|
-
}, effectiveTimeout);
|
|
51
|
-
}
|
|
52
|
-
this._pending.set(id, { resolve, reject, timer });
|
|
53
|
-
this._channel.postMessage(JSON.stringify({ id, method, data }));
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
send(method, data = null) {
|
|
57
|
-
this._channel.postMessage(JSON.stringify({ method, data }));
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Número de llamadas pendientes
|
|
61
|
-
*/
|
|
62
|
-
get pendingCount() {
|
|
63
|
-
return this._pending.size;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Cancela todas las llamadas pendientes
|
|
67
|
-
*/
|
|
68
|
-
cancelAll() {
|
|
69
|
-
for (const [, { reject, timer }] of this._pending) {
|
|
70
|
-
if (timer !== null) {
|
|
71
|
-
clearTimeout(timer);
|
|
72
|
-
}
|
|
73
|
-
reject(new Error('Cancelled'));
|
|
74
|
-
}
|
|
75
|
-
this._pending.clear();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=native-bridge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"native-bridge.js","sourceRoot":"","sources":["../../../src/browser/native-bridge.ts"],"names":[],"mappings":"AAkBA,2DAA2D;AAE3D,MAAM,CAAC,OAAO,OAAO,YAAY;IAO7B,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,YAAY,GAAG,yBAAyB,EAAiB;QANxF,aAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC1C,YAAO,GAAG,CAAC,CAAC;QAMhB,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QAEA,MAAc,CAAC,YAAY,CAAC,GAAG,CAAC,EAAU,EAAE,KAAU,EAAE,MAAW,EAAE,EAAE;YACpE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,iEAAiE;QACjE,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE;YACnB,GAAG,CAAC,MAAoB,EAAE,IAAqB;gBAC3C,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;oBACjB,OAAQ,MAAc,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;gBACD,OAAO,CAAC,IAAc,EAAE,OAAuB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACjG,CAAC;SACJ,CAA4B,CAAC;IAClC,CAAC;IAGO,SAAS,CAAC,EAAU,EAAE,KAAU,EAAE,MAAW;QAEjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACzB,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEzB,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,YAAY,KAAK,CAAA,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,OAAgB,IAAI,EAAE,OAAuB;QAG9D,MAAM,gBAAgB,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QAEhF,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAE1B,IAAI,KAAK,GAAyC,IAAI,CAAC;YAEvD,kCAAkC;YAClC,IAAI,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACpD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACzB,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,gBAAgB,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC;gBACpE,CAAC,EAAE,gBAAgB,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,QAAS,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACP,CAAC;IAGD,IAAI,CAAC,MAAc,EAAE,OAAgB,IAAI;QACrC,IAAI,CAAC,QAAS,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,SAAS;QACL,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,YAAY,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACJ","sourcesContent":["// ─── Tipos ───────────────────────────────────────────────\ninterface BridgeOptions {\n channel: Channel;\n timeout?: number | null;\n callbackName?: string; // ← nuevo\n}\ninterface PendingCall {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n timer: ReturnType<typeof setTimeout> | null;\n}\n\ninterface Channel {\n postMessage: (message: string) => void;\n}\n\n\n\n// ─── Clase ──────────────────────────────────────────────\n\nexport default class NativeBridge {\n private _pending = new Map<number, PendingCall>();\n private _callId = 0;\n private readonly _defaultTimeout: number | null;\n private readonly _channel: Channel;\n\n\n constructor({ channel, timeout = 3000, callbackName = '__nativeResponseHandler' }: BridgeOptions) {\n this._defaultTimeout = timeout;\n this._channel = channel;\n\n if (!this._channel) {\n throw new Error('Channel not found');\n }\n\n (window as any)[callbackName] = (id: number, error: any, result: any) => {\n this._callback(id, error, result);\n };\n\n // Proxy: cualquier propiedad no existente se convierte en call()\n return new Proxy(this, {\n get(target: NativeBridge, prop: string | symbol) {\n if (prop in target) {\n return (target as any)[prop];\n }\n return (data?: unknown, timeout?: number | null) => target.call(String(prop), data, timeout);\n },\n }) as unknown as NativeBridge;\n }\n\n\n private _callback(id: number, error: any, result: any) {\n\n const pending = this._pending.get(id);\n if (!pending) {\n return;\n }\n\n if (pending.timer !== null) {\n clearTimeout(pending.timer);\n }\n\n this._pending.delete(id);\n\n if (error) {\n pending.reject(error instanceof Error? error : new Error(String(error)));\n } else {\n pending.resolve(result);\n }\n }\n\n call(method: string, data: unknown = null, timeout?: number | null): Promise<unknown> {\n\n\n const effectiveTimeout = timeout !== undefined ? timeout : this._defaultTimeout;\n\n return new Promise<unknown>((resolve, reject) => {\n const id = this._callId++;\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n // Solo crear timer si hay timeout\n if (effectiveTimeout !== null && effectiveTimeout > 0) {\n timer = setTimeout(() => {\n this._pending.delete(id);\n reject(new Error(`Timeout (${effectiveTimeout}ms): ${method}`));\n }, effectiveTimeout);\n }\n\n this._pending.set(id, { resolve, reject, timer });\n this._channel!.postMessage(JSON.stringify({ id, method, data }));\n });\n }\n\n\n send(method: string, data: unknown = null): void {\n this._channel!.postMessage(JSON.stringify({ method, data }));\n }\n\n /**\n * Número de llamadas pendientes\n */\n get pendingCount(): number {\n return this._pending.size;\n }\n\n /**\n * Cancela todas las llamadas pendientes\n */\n cancelAll(): void {\n for (const [, { reject, timer }] of this._pending) {\n if (timer !== null) {\n clearTimeout(timer);\n }\n reject(new Error('Cancelled'));\n }\n this._pending.clear();\n }\n}"]}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
export default class CancellablePromise extends Promise {
|
|
2
|
-
static get [Symbol.species]() {
|
|
3
|
-
return Promise;
|
|
4
|
-
}
|
|
5
|
-
constructor(executor) {
|
|
6
|
-
const controller = new AbortController();
|
|
7
|
-
super((resolve, reject) => {
|
|
8
|
-
controller.signal.addEventListener("abort", () => {
|
|
9
|
-
reject(controller.signal.reason);
|
|
10
|
-
});
|
|
11
|
-
executor(resolve, reject, controller.signal);
|
|
12
|
-
});
|
|
13
|
-
this._controller = controller;
|
|
14
|
-
}
|
|
15
|
-
get cancelled() {
|
|
16
|
-
return this._controller.signal.aborted;
|
|
17
|
-
}
|
|
18
|
-
cancel(reason = new Error("Promesa cancelada")) {
|
|
19
|
-
if (!this.cancelled) {
|
|
20
|
-
this._controller.abort(reason);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
static async compete(promises) {
|
|
24
|
-
if (promises.length === 0) {
|
|
25
|
-
throw new Error("No promises to compete.");
|
|
26
|
-
}
|
|
27
|
-
const result = await Promise.race(promises.map((promise, index) => promise.then(value => ({ index, value, rejected: false }), reason => ({ index, reason, rejected: true }))));
|
|
28
|
-
for (let i = 0; i < promises.length; i++) {
|
|
29
|
-
if (i !== result.index) {
|
|
30
|
-
promises[i].cancel();
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (result.rejected) {
|
|
34
|
-
throw result.reason;
|
|
35
|
-
}
|
|
36
|
-
return result.value;
|
|
37
|
-
}
|
|
38
|
-
static async cooperate(promises) {
|
|
39
|
-
try {
|
|
40
|
-
return await Promise.all(promises);
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
for (const p of promises) {
|
|
44
|
-
p.cancel();
|
|
45
|
-
}
|
|
46
|
-
throw error;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
static withTimeout(executor, ms) {
|
|
50
|
-
return new CancellablePromise((resolve, reject, signal) => {
|
|
51
|
-
let settled = false;
|
|
52
|
-
const timer = setTimeout(() => {
|
|
53
|
-
safeReject(new Error(`Timeout: ${ms}ms`));
|
|
54
|
-
}, ms);
|
|
55
|
-
const cleanup = () => clearTimeout(timer);
|
|
56
|
-
const safeResolve = (value) => {
|
|
57
|
-
if (settled)
|
|
58
|
-
return;
|
|
59
|
-
settled = true;
|
|
60
|
-
cleanup();
|
|
61
|
-
resolve(value);
|
|
62
|
-
};
|
|
63
|
-
const safeReject = (reason) => {
|
|
64
|
-
if (settled)
|
|
65
|
-
return;
|
|
66
|
-
settled = true;
|
|
67
|
-
cleanup();
|
|
68
|
-
reject(reason);
|
|
69
|
-
};
|
|
70
|
-
signal.addEventListener("abort", () => {
|
|
71
|
-
settled = true;
|
|
72
|
-
cleanup();
|
|
73
|
-
}, { once: true });
|
|
74
|
-
executor(safeResolve, safeReject, signal);
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=cancellable-promise.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cancellable-promise.js","sourceRoot":"","sources":["../../src/cancellable-promise.ts"],"names":[],"mappings":"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","sourcesContent":["type CancellablePromiseExecutor<T> = (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: unknown) => void,\n signal: AbortSignal\n) => void;\n\nexport default class CancellablePromise<T> extends Promise<T> {\n\n private _controller: AbortController;\n\n static get [Symbol.species]() {\n return Promise;\n }\n\n constructor(executor: CancellablePromiseExecutor<T>) {\n const controller = new AbortController();\n\n super((resolve, reject) => {\n controller.signal.addEventListener(\"abort\", () => {\n reject(controller.signal.reason);\n });\n\n executor(resolve, reject, controller.signal);\n });\n\n this._controller = controller;\n }\n\n get cancelled(): boolean {\n return this._controller.signal.aborted;\n }\n\n cancel(reason: unknown = new Error(\"Promesa cancelada\")): void {\n if (!this.cancelled) {\n this._controller.abort(reason);\n }\n }\n\n static async compete<T>(promises: CancellablePromise<T>[]): Promise<T> {\n if (promises.length === 0) {\n throw new Error(\"No promises to compete.\");\n }\n\n const result = await Promise.race(\n promises.map((promise, index) => promise.then(\n value => ({index, value, rejected: false as const}),\n reason => ({index, reason, rejected: true as const}),\n ))\n );\n\n for (let i = 0; i < promises.length; i++) {\n if (i !== result.index) {\n promises[i].cancel();\n }\n }\n\n if (result.rejected) {\n throw result.reason;\n }\n\n return result.value;\n }\n\n static async cooperate<T>(promises: CancellablePromise<T>[]): Promise<T[]> {\n try {\n return await Promise.all(promises);\n } catch (error) {\n for (const p of promises) {\n p.cancel();\n }\n throw error;\n }\n }\n\n static withTimeout<T>(executor: CancellablePromiseExecutor<T>, ms: number): CancellablePromise<T> {\n return new CancellablePromise<T>((resolve, reject, signal) => {\n let settled = false;\n const timer = setTimeout(() => {\n safeReject(new Error(`Timeout: ${ms}ms`));\n }, ms);\n\n const cleanup = () => clearTimeout(timer);\n const safeResolve = (value: T | PromiseLike<T>) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n };\n const safeReject = (reason?: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(reason);\n };\n\n signal.addEventListener(\"abort\", () => {\n settled = true;\n cleanup();\n }, {once: true});\n executor(safeResolve, safeReject, signal);\n });\n }\n}"]}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
function isRecordParams(params) {
|
|
2
|
-
return params !== null &&
|
|
3
|
-
typeof params === 'object' &&
|
|
4
|
-
!(params instanceof URLSearchParams) &&
|
|
5
|
-
typeof params[Symbol.iterator] !== 'function';
|
|
6
|
-
}
|
|
7
|
-
function appendCleanValue(params, key, value) {
|
|
8
|
-
if (value === null || value === undefined)
|
|
9
|
-
return;
|
|
10
|
-
if (Array.isArray(value)) {
|
|
11
|
-
for (const item of value) {
|
|
12
|
-
appendCleanValue(params, key, item);
|
|
13
|
-
}
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
params.append(key, String(value));
|
|
17
|
-
}
|
|
18
|
-
export default class CleanURLSearchParams extends URLSearchParams {
|
|
19
|
-
constructor(params) {
|
|
20
|
-
if (!isRecordParams(params)) {
|
|
21
|
-
super(params);
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
super();
|
|
25
|
-
// Filtrar `null` y `undefined` antes de añadirlos a URLSearchParams
|
|
26
|
-
for (const [key, value] of Object.entries(params)) {
|
|
27
|
-
appendCleanValue(this, key, value);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=clean-url-search-params.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clean-url-search-params.js","sourceRoot":"","sources":["../../src/clean-url-search-params.ts"],"names":[],"mappings":"AAEA,SAAS,cAAc,CAAC,MAAe;IACnC,OAAO,MAAM,KAAK,IAAI;QAClB,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,CAAC,MAAM,YAAY,eAAe,CAAC;QACpC,OAAQ,MAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC;AAC/D,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuB,EAAE,GAAW,EAAE,KAAU;IACtE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAElD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,OAAO;IACX,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,eAAe;IAC7D,YAAY,MAAkC;QAC1C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,MAA2D,CAAC,CAAC;YACnE,OAAO;QACX,CAAC;QAED,KAAK,EAAE,CAAC;QAER,oEAAoE;QACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;CACJ","sourcesContent":["type CleanURLSearchParamsInput = string | URLSearchParams | string[][] | Record<string, any>;\n\nfunction isRecordParams(params: unknown): params is Record<string, any> {\n return params !== null &&\n typeof params === 'object' &&\n !(params instanceof URLSearchParams) &&\n typeof (params as any)[Symbol.iterator] !== 'function';\n}\n\nfunction appendCleanValue(params: URLSearchParams, key: string, value: any): void {\n if (value === null || value === undefined) return;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n appendCleanValue(params, key, item);\n }\n return;\n }\n\n params.append(key, String(value));\n}\n\nexport default class CleanURLSearchParams extends URLSearchParams {\n constructor(params?: CleanURLSearchParamsInput) {\n if (!isRecordParams(params)) {\n super(params as string | URLSearchParams | string[][] | undefined);\n return;\n }\n\n super();\n\n // Filtrar `null` y `undefined` antes de añadirlos a URLSearchParams\n for (const [key, value] of Object.entries(params)) {\n appendCleanValue(this, key, value);\n }\n }\n}"]}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A dictionary-like structure with caching and expiration capabilities.
|
|
3
|
-
* @template T - The type of the values stored in the cache.
|
|
4
|
-
*/
|
|
5
|
-
export default class CacheDictionary {
|
|
6
|
-
/**
|
|
7
|
-
* @param {((key: string) => T) | null} fallback - Optional function to call when a key is not found.
|
|
8
|
-
* @param {number | null} defaultDuration - Default duration in seconds for cache items.
|
|
9
|
-
*/
|
|
10
|
-
constructor(fallback = null, defaultDuration = null) {
|
|
11
|
-
this.fallback = fallback;
|
|
12
|
-
this.cache = Object.create(null);
|
|
13
|
-
this.defaultDuration = defaultDuration;
|
|
14
|
-
this.expiration = Object.create(null);
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Gets the expiration date for a specific key.
|
|
18
|
-
* @param {string} key - The key.
|
|
19
|
-
* @returns {Date | undefined} The expiration date or undefined.
|
|
20
|
-
*/
|
|
21
|
-
getExpiration(key) {
|
|
22
|
-
return this.expiration[key];
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Sets a specific expiration date for a key.
|
|
26
|
-
* @param {string} key - The key.
|
|
27
|
-
* @param {Date | undefined} expiration - The expiration date.
|
|
28
|
-
*/
|
|
29
|
-
setExpiration(key, expiration) {
|
|
30
|
-
this.expiration[key] = expiration;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Sets a duration in seconds for a key's expiration.
|
|
34
|
-
* @param {string} key - The key.
|
|
35
|
-
* @param {number | null} duration - Duration in seconds. If null, expiration is removed.
|
|
36
|
-
*/
|
|
37
|
-
setDuration(key, duration) {
|
|
38
|
-
if (duration === null) {
|
|
39
|
-
delete this.expiration[key];
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
this.expiration[key] = this.calculateExpiration(duration);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Gets a value from the cache. If not found and a fallback exists, it uses the fallback.
|
|
47
|
-
* If the item is expired, it's removed and null is returned.
|
|
48
|
-
* @param {string} key - The key to retrieve.
|
|
49
|
-
* @returns {T | null} The value or null if not found/expired.
|
|
50
|
-
*/
|
|
51
|
-
get(key) {
|
|
52
|
-
if (!Object.prototype.hasOwnProperty.call(this.cache, key)) {
|
|
53
|
-
if (this.fallback) {
|
|
54
|
-
this.cache[key] = this.fallback(key);
|
|
55
|
-
this.expiration[key] = this.calculateExpiration(this.defaultDuration);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
if (this.isExpired(key)) {
|
|
62
|
-
this.remove(key);
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
return this.cache[key];
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Sets a value in the cache with an optional duration.
|
|
69
|
-
* @param {string} key - The key.
|
|
70
|
-
* @param {T} value - The value to store.
|
|
71
|
-
* @param {number | null} duration - Duration in seconds.
|
|
72
|
-
*/
|
|
73
|
-
set(key, value, duration = null) {
|
|
74
|
-
this.cache[key] = value;
|
|
75
|
-
this.expiration[key] = this.calculateExpiration(duration);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Removes an item from the cache.
|
|
79
|
-
* @param {string} key - The key to remove.
|
|
80
|
-
*/
|
|
81
|
-
remove(key) {
|
|
82
|
-
delete this.cache[key];
|
|
83
|
-
delete this.expiration[key];
|
|
84
|
-
}
|
|
85
|
-
isExpired(key) {
|
|
86
|
-
const expiration = this.expiration[key];
|
|
87
|
-
if (expiration instanceof Date) {
|
|
88
|
-
return expiration < new Date();
|
|
89
|
-
}
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
calculateExpiration(duration) {
|
|
93
|
-
if (duration === null) {
|
|
94
|
-
return undefined;
|
|
95
|
-
}
|
|
96
|
-
return new Date(Date.now() + duration * 1000);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=cache-dictionary.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache-dictionary.js","sourceRoot":"","sources":["../../../src/collections/cache-dictionary.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A dictionary-like structure with caching and expiration capabilities.\n * @template T - The type of the values stored in the cache.\n */\nexport default class CacheDictionary<T> {\n private readonly fallback: ((key: string) => T) | null;\n private readonly cache: { [key: string]: T };\n private readonly defaultDuration: number | null;\n private readonly expiration: { [key: string]: Date | undefined };\n\n /**\n * @param {((key: string) => T) | null} fallback - Optional function to call when a key is not found.\n * @param {number | null} defaultDuration - Default duration in seconds for cache items.\n */\n constructor(fallback: ((key: string) => T) | null = null, defaultDuration: number | null = null) {\n this.fallback = fallback;\n this.cache = Object.create(null);\n this.defaultDuration = defaultDuration;\n this.expiration = Object.create(null);\n }\n\n /**\n * Gets the expiration date for a specific key.\n * @param {string} key - The key.\n * @returns {Date | undefined} The expiration date or undefined.\n */\n public getExpiration(key: string): Date | undefined {\n return this.expiration[key];\n }\n\n /**\n * Sets a specific expiration date for a key.\n * @param {string} key - The key.\n * @param {Date | undefined} expiration - The expiration date.\n */\n public setExpiration(key: string, expiration: Date | undefined): void {\n this.expiration[key] = expiration;\n }\n\n /**\n * Sets a duration in seconds for a key's expiration.\n * @param {string} key - The key.\n * @param {number | null} duration - Duration in seconds. If null, expiration is removed.\n */\n public setDuration(key: string, duration: number | null): void {\n if (duration === null) {\n delete this.expiration[key];\n } else {\n this.expiration[key] = this.calculateExpiration(duration);\n }\n }\n\n /**\n * Gets a value from the cache. If not found and a fallback exists, it uses the fallback.\n * If the item is expired, it's removed and null is returned.\n * @param {string} key - The key to retrieve.\n * @returns {T | null} The value or null if not found/expired.\n */\n public get(key: string): T | null {\n if (!Object.prototype.hasOwnProperty.call(this.cache, key)) {\n if (this.fallback) {\n this.cache[key] = this.fallback(key);\n this.expiration[key] = this.calculateExpiration(this.defaultDuration);\n } else {\n return null;\n }\n }\n\n if (this.isExpired(key)) {\n this.remove(key);\n return null;\n }\n\n return this.cache[key];\n }\n\n /**\n * Sets a value in the cache with an optional duration.\n * @param {string} key - The key.\n * @param {T} value - The value to store.\n * @param {number | null} duration - Duration in seconds.\n */\n public set(key: string, value: T, duration: number | null = null): void {\n this.cache[key] = value;\n this.expiration[key] = this.calculateExpiration(duration);\n }\n\n /**\n * Removes an item from the cache.\n * @param {string} key - The key to remove.\n */\n public remove(key: string): void {\n delete this.cache[key];\n delete this.expiration[key];\n }\n\n private isExpired(key: string): boolean {\n const expiration = this.expiration[key];\n if (expiration instanceof Date) {\n return expiration < new Date();\n }\n return false;\n }\n\n private calculateExpiration(duration: number | null): Date | undefined {\n if (duration === null) {\n return undefined;\n }\n\n return new Date(Date.now() + duration * 1000);\n }\n}"]}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DefaultMap<K, V>
|
|
3
|
-
* A Map that automatically creates and saves a default value
|
|
4
|
-
* when accessing a non-existent key with get(key).
|
|
5
|
-
*
|
|
6
|
-
* @template K - The type of the keys.
|
|
7
|
-
* @template V - The type of the values.
|
|
8
|
-
* @example
|
|
9
|
-
* const m = new DefaultMap<string, number>(() => 0);
|
|
10
|
-
* m.get("a"); // 0
|
|
11
|
-
* m.set("a", m.get("a") + 1); // 1
|
|
12
|
-
*/
|
|
13
|
-
export default class DefaultMap extends Map {
|
|
14
|
-
/**
|
|
15
|
-
* @param {UnaryFunction<K, V>} factoryMethod - Function that produces the default value for a key.
|
|
16
|
-
* @param {Iterable<[K, V]>} [entries] - Initial entries.
|
|
17
|
-
*/
|
|
18
|
-
constructor(factoryMethod, entries) {
|
|
19
|
-
super(entries);
|
|
20
|
-
if (typeof factoryMethod !== "function") {
|
|
21
|
-
throw new TypeError("DefaultMap needs a factory (key => defaultValue).");
|
|
22
|
-
}
|
|
23
|
-
this._factoryMethod = factoryMethod;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Gets the value for the key. If it does not exist, it creates it using the factory,
|
|
27
|
-
* saves it, and returns it.
|
|
28
|
-
*
|
|
29
|
-
* @param {K} key - The key to get.
|
|
30
|
-
* @returns {V} The value associated with the key.
|
|
31
|
-
*/
|
|
32
|
-
get(key) {
|
|
33
|
-
if (!super.has(key)) {
|
|
34
|
-
const value = this._factoryMethod(key);
|
|
35
|
-
super.set(key, value);
|
|
36
|
-
return value;
|
|
37
|
-
}
|
|
38
|
-
// ¡super.get puede devolver undefined si no existe! Pero ya comprobamos has(key)
|
|
39
|
-
return super.get(key);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=default-map.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"default-map.js","sourceRoot":"","sources":["../../../src/collections/default-map.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,UAAiB,SAAQ,GAAS;IAGnD;;;OAGG;IACH,YAAY,aAAkC,EAAE,OAA0B;QACtE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACM,GAAG,CAAC,GAAM;QACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACvC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,iFAAiF;QACjF,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IAC3B,CAAC;CAGJ","sourcesContent":["import type {UnaryFunction} from \"../types.js\";\n\n/**\n * DefaultMap<K, V>\n * A Map that automatically creates and saves a default value\n * when accessing a non-existent key with get(key).\n *\n * @template K - The type of the keys.\n * @template V - The type of the values.\n * @example\n * const m = new DefaultMap<string, number>(() => 0);\n * m.get(\"a\"); // 0\n * m.set(\"a\", m.get(\"a\") + 1); // 1\n */\nexport default class DefaultMap<K, V> extends Map<K, V> {\n private readonly _factoryMethod: (key: K) => V;\n\n /**\n * @param {UnaryFunction<K, V>} factoryMethod - Function that produces the default value for a key.\n * @param {Iterable<[K, V]>} [entries] - Initial entries.\n */\n constructor(factoryMethod: UnaryFunction<K, V>, entries?: Iterable<[K, V]>) {\n super(entries);\n if (typeof factoryMethod !== \"function\") {\n throw new TypeError(\"DefaultMap needs a factory (key => defaultValue).\");\n }\n this._factoryMethod = factoryMethod;\n }\n\n /**\n * Gets the value for the key. If it does not exist, it creates it using the factory,\n * saves it, and returns it.\n *\n * @param {K} key - The key to get.\n * @returns {V} The value associated with the key.\n */\n override get(key: K): V {\n if (!super.has(key)) {\n const value = this._factoryMethod(key);\n super.set(key, value);\n return value;\n }\n // ¡super.get puede devolver undefined si no existe! Pero ya comprobamos has(key)\n return super.get(key)!;\n }\n\n\n}\n"]}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DefaultWeakMap<K, V>
|
|
3
|
-
* A WeakMap that automatically creates and saves a default value
|
|
4
|
-
* when accessing a non-existent key with get(key).
|
|
5
|
-
*
|
|
6
|
-
* @template K - The type of the keys. Must be an object.
|
|
7
|
-
* @template V - The type of the values.
|
|
8
|
-
*/
|
|
9
|
-
export default class DefaultWeakMap extends WeakMap {
|
|
10
|
-
/**
|
|
11
|
-
* @param {UnaryFunction<K, V>} factoryMethod - Function that produces the default value for a key.
|
|
12
|
-
* @param {Iterable<[K, V]>} [entries] - Initial entries.
|
|
13
|
-
*/
|
|
14
|
-
constructor(factoryMethod, entries) {
|
|
15
|
-
super();
|
|
16
|
-
if (entries != null) {
|
|
17
|
-
for (const [key, value] of entries ?? []) {
|
|
18
|
-
this.set(key, value);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
if (typeof factoryMethod !== "function") {
|
|
22
|
-
throw new TypeError("DefaultWeakMap needs a factory (key => defaultValue).");
|
|
23
|
-
}
|
|
24
|
-
this._factoryMethod = factoryMethod;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Gets the value for the key. If it does not exist, it creates it using the factory,
|
|
28
|
-
* saves it, and returns it.
|
|
29
|
-
*
|
|
30
|
-
* @param {K} key - The key to get.
|
|
31
|
-
* @returns {V} The value associated with the key.
|
|
32
|
-
*/
|
|
33
|
-
get(key) {
|
|
34
|
-
if (!super.has(key)) {
|
|
35
|
-
const value = this._factoryMethod(key);
|
|
36
|
-
super.set(key, value);
|
|
37
|
-
return value;
|
|
38
|
-
}
|
|
39
|
-
// ¡super.get puede devolver undefined si no existe! Pero ya comprobamos has(key)
|
|
40
|
-
return super.get(key);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=default-weak-map.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"default-weak-map.js","sourceRoot":"","sources":["../../../src/collections/default-weak-map.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,cAAoC,SAAQ,OAAa;IAG1E;;;OAGG;IACH,YAAY,aAAkC,EAAE,OAA0B;QACtE,KAAK,EAAE,CAAC;QAER,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;gBACvC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QAED,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACM,GAAG,CAAC,GAAM;QACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACvC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,iFAAiF;QACjF,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IAC3B,CAAC;CAGJ","sourcesContent":["import type {UnaryFunction} from \"../types.js\";\n\n/**\n * DefaultWeakMap<K, V>\n * A WeakMap that automatically creates and saves a default value\n * when accessing a non-existent key with get(key).\n *\n * @template K - The type of the keys. Must be an object.\n * @template V - The type of the values.\n */\nexport default class DefaultWeakMap<K extends object, V> extends WeakMap<K, V> {\n private readonly _factoryMethod: (key: K) => V;\n\n /**\n * @param {UnaryFunction<K, V>} factoryMethod - Function that produces the default value for a key.\n * @param {Iterable<[K, V]>} [entries] - Initial entries.\n */\n constructor(factoryMethod: UnaryFunction<K, V>, entries?: Iterable<[K, V]>) {\n super();\n\n if (entries != null) {\n for (const [key, value] of entries ?? []) {\n this.set(key, value);\n }\n }\n\n if (typeof factoryMethod !== \"function\") {\n throw new TypeError(\"DefaultWeakMap needs a factory (key => defaultValue).\");\n }\n this._factoryMethod = factoryMethod;\n }\n\n /**\n * Gets the value for the key. If it does not exist, it creates it using the factory,\n * saves it, and returns it.\n *\n * @param {K} key - The key to get.\n * @returns {V} The value associated with the key.\n */\n override get(key: K): V {\n if (!super.has(key)) {\n const value = this._factoryMethod(key);\n super.set(key, value);\n return value;\n }\n // ¡super.get puede devolver undefined si no existe! Pero ya comprobamos has(key)\n return super.get(key)!;\n }\n\n\n}\n"]}
|