@apia/util 1.0.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animate/index.d.ts +4 -0
- package/dist/animate/index.d.ts.map +1 -0
- package/dist/animate/index.js +24 -0
- package/dist/animate/index.js.map +1 -0
- package/dist/array/arrayOrArray.d.ts +4 -0
- package/dist/array/arrayOrArray.d.ts.map +1 -0
- package/dist/array/arrayOrArray.js +8 -0
- package/dist/array/arrayOrArray.js.map +1 -0
- package/dist/array/getIndex.d.ts +14 -0
- package/dist/array/getIndex.d.ts.map +1 -0
- package/dist/array/getIndex.js +12 -0
- package/dist/array/getIndex.js.map +1 -0
- package/dist/crypto/decrypt.d.ts +4 -0
- package/dist/crypto/decrypt.d.ts.map +1 -0
- package/dist/crypto/decrypt.js +16 -0
- package/dist/crypto/decrypt.js.map +1 -0
- package/dist/crypto/encrypt.d.ts +4 -0
- package/dist/crypto/encrypt.d.ts.map +1 -0
- package/dist/crypto/encrypt.js +13 -0
- package/dist/crypto/encrypt.js.map +1 -0
- package/dist/crypto/generateKey.js +11 -0
- package/dist/crypto/generateKey.js.map +1 -0
- package/dist/date/apiaDateToStandarFormat.d.ts +4 -0
- package/dist/date/apiaDateToStandarFormat.d.ts.map +1 -0
- package/dist/date/apiaDateToStandarFormat.js +12 -0
- package/dist/date/apiaDateToStandarFormat.js.map +1 -0
- package/dist/date/dateToApiaFormat.d.ts +4 -0
- package/dist/date/dateToApiaFormat.d.ts.map +1 -0
- package/dist/date/dateToApiaFormat.js +9 -0
- package/dist/date/dateToApiaFormat.js.map +1 -0
- package/dist/date/getDateFormat.d.ts +11 -0
- package/dist/date/getDateFormat.d.ts.map +1 -0
- package/dist/date/getDateFormat.js +20 -0
- package/dist/date/getDateFormat.js.map +1 -0
- package/dist/debug/debugDispatcher.d.ts +32 -0
- package/dist/debug/debugDispatcher.d.ts.map +1 -0
- package/dist/debug/debugDispatcher.js +72 -0
- package/dist/debug/debugDispatcher.js.map +1 -0
- package/dist/debug/shortcutController.d.ts +57 -0
- package/dist/debug/shortcutController.d.ts.map +1 -0
- package/dist/debug/shortcutController.js +152 -0
- package/dist/debug/shortcutController.js.map +1 -0
- package/dist/documents/downloadStringAsDoc.d.ts +8 -0
- package/dist/documents/downloadStringAsDoc.d.ts.map +1 -0
- package/dist/documents/downloadStringAsDoc.js +12 -0
- package/dist/documents/downloadStringAsDoc.js.map +1 -0
- package/dist/documents/downloadUrl.d.ts +20 -0
- package/dist/documents/downloadUrl.d.ts.map +1 -0
- package/dist/documents/downloadUrl.js +18 -0
- package/dist/documents/downloadUrl.js.map +1 -0
- package/dist/documents/openAndReadFile.d.ts +4 -0
- package/dist/documents/openAndReadFile.d.ts.map +1 -0
- package/dist/documents/openAndReadFile.js +29 -0
- package/dist/documents/openAndReadFile.js.map +1 -0
- package/dist/dom/autoDisconnectMutationObserver.d.ts +17 -0
- package/dist/dom/autoDisconnectMutationObserver.d.ts.map +1 -0
- package/dist/dom/autoDisconnectMutationObserver.js +35 -0
- package/dist/dom/autoDisconnectMutationObserver.js.map +1 -0
- package/dist/dom/customEvents.d.ts +40 -0
- package/dist/dom/customEvents.d.ts.map +1 -0
- package/dist/dom/customEvents.js +34 -0
- package/dist/dom/customEvents.js.map +1 -0
- package/dist/dom/enableChildrenFocus.d.ts +18 -0
- package/dist/dom/enableChildrenFocus.d.ts.map +1 -0
- package/dist/dom/enableChildrenFocus.js +26 -0
- package/dist/dom/enableChildrenFocus.js.map +1 -0
- package/dist/dom/findOffsetRelativeToScrollParent.d.ts +7 -0
- package/dist/dom/findOffsetRelativeToScrollParent.d.ts.map +1 -0
- package/dist/dom/findOffsetRelativeToScrollParent.js +19 -0
- package/dist/dom/findOffsetRelativeToScrollParent.js.map +1 -0
- package/dist/dom/findScrollContainer.d.ts +8 -0
- package/dist/dom/findScrollContainer.d.ts.map +1 -0
- package/dist/dom/findScrollContainer.js +9 -0
- package/dist/dom/findScrollContainer.js.map +1 -0
- package/dist/dom/getFocusSelector.d.ts +25 -0
- package/dist/dom/getFocusSelector.d.ts.map +1 -0
- package/dist/dom/getFocusSelector.js +30 -0
- package/dist/dom/getFocusSelector.js.map +1 -0
- package/dist/dom/getSpecificParent.d.ts +23 -0
- package/dist/dom/getSpecificParent.d.ts.map +1 -0
- package/dist/dom/getSpecificParent.js +19 -0
- package/dist/dom/getSpecificParent.js.map +1 -0
- package/dist/dom/isChild.d.ts +13 -0
- package/dist/dom/isChild.d.ts.map +1 -0
- package/dist/dom/isChild.js +8 -0
- package/dist/dom/isChild.js.map +1 -0
- package/dist/dom/scrollParentIntoElement.d.ts +9 -0
- package/dist/dom/scrollParentIntoElement.d.ts.map +1 -0
- package/dist/dom/scrollParentIntoElement.js +24 -0
- package/dist/dom/scrollParentIntoElement.js.map +1 -0
- package/dist/dom/url.d.ts +18 -0
- package/dist/dom/url.d.ts.map +1 -0
- package/dist/dom/url.js +52 -0
- package/dist/dom/url.js.map +1 -0
- package/dist/dom/usePanAndZoom.d.ts +14 -0
- package/dist/dom/usePanAndZoom.d.ts.map +1 -0
- package/dist/dom/usePanAndZoom.js +111 -0
- package/dist/dom/usePanAndZoom.js.map +1 -0
- package/dist/encoding/index.d.ts +8 -0
- package/dist/encoding/index.d.ts.map +1 -0
- package/dist/encoding/index.js +12 -0
- package/dist/encoding/index.js.map +1 -0
- package/dist/events/BouncingEmitter.d.ts +67 -0
- package/dist/events/BouncingEmitter.d.ts.map +1 -0
- package/dist/events/BouncingEmitter.js +72 -0
- package/dist/events/BouncingEmitter.js.map +1 -0
- package/dist/events/EventEmitter.d.ts +47 -0
- package/dist/events/EventEmitter.d.ts.map +1 -0
- package/dist/events/EventEmitter.js +75 -0
- package/dist/events/EventEmitter.js.map +1 -0
- package/dist/events/StatefulEmitter.d.ts +44 -0
- package/dist/events/StatefulEmitter.d.ts.map +1 -0
- package/dist/events/StatefulEmitter.js +57 -0
- package/dist/events/StatefulEmitter.js.map +1 -0
- package/dist/events/types.d.ts +29 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/focus/focusController.d.ts +108 -0
- package/dist/focus/focusController.d.ts.map +1 -0
- package/dist/focus/focusController.js +295 -0
- package/dist/focus/focusController.js.map +1 -0
- package/dist/focus/globalFocus.d.ts +24 -0
- package/dist/focus/globalFocus.d.ts.map +1 -0
- package/dist/focus/globalFocus.js +87 -0
- package/dist/focus/globalFocus.js.map +1 -0
- package/dist/history/History.d.ts +81 -0
- package/dist/history/History.d.ts.map +1 -0
- package/dist/history/History.js +122 -0
- package/dist/history/History.js.map +1 -0
- package/dist/hooks/useCombinedRefs.d.ts +18 -0
- package/dist/hooks/useCombinedRefs.d.ts.map +1 -0
- package/dist/hooks/useCombinedRefs.js +20 -0
- package/dist/hooks/useCombinedRefs.js.map +1 -0
- package/dist/hooks/useDebouncedCallback.d.ts +7 -0
- package/dist/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/dist/hooks/useDebouncedCallback.js +21 -0
- package/dist/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/hooks/useLatest.d.ts +13 -0
- package/dist/hooks/useLatest.d.ts.map +1 -0
- package/dist/hooks/useLatest.js +10 -0
- package/dist/hooks/useLatest.js.map +1 -0
- package/dist/hooks/useMount.d.ts +6 -0
- package/dist/hooks/useMount.d.ts.map +1 -0
- package/dist/hooks/useMount.js +14 -0
- package/dist/hooks/useMount.js.map +1 -0
- package/dist/hooks/usePrevious.d.ts +6 -0
- package/dist/hooks/usePrevious.d.ts.map +1 -0
- package/dist/hooks/usePrevious.js +12 -0
- package/dist/hooks/usePrevious.js.map +1 -0
- package/dist/hooks/useShallowMemo.d.ts +9 -0
- package/dist/hooks/useShallowMemo.d.ts.map +1 -0
- package/dist/hooks/useShallowMemo.js +42 -0
- package/dist/hooks/useShallowMemo.js.map +1 -0
- package/dist/hooks/useStateRef.d.ts +10 -0
- package/dist/hooks/useStateRef.d.ts.map +1 -0
- package/dist/hooks/useStateRef.js +11 -0
- package/dist/hooks/useStateRef.js.map +1 -0
- package/dist/hooks/useSubscription.d.ts +31 -0
- package/dist/hooks/useSubscription.d.ts.map +1 -0
- package/dist/hooks/useSubscription.js +21 -0
- package/dist/hooks/useSubscription.js.map +1 -0
- package/dist/hooks/useUnmount.d.ts +4 -0
- package/dist/hooks/useUnmount.d.ts.map +1 -0
- package/dist/hooks/useUnmount.js +10 -0
- package/dist/hooks/useUnmount.js.map +1 -0
- package/dist/hooks/useUpdateEffect.d.ts +10 -0
- package/dist/hooks/useUpdateEffect.d.ts.map +1 -0
- package/dist/hooks/useUpdateEffect.js +16 -0
- package/dist/hooks/useUpdateEffect.js.map +1 -0
- package/dist/imperative/makeImperativeComponent.d.ts +56 -0
- package/dist/imperative/makeImperativeComponent.d.ts.map +1 -0
- package/dist/imperative/makeImperativeComponent.js +48 -0
- package/dist/imperative/makeImperativeComponent.js.map +1 -0
- package/dist/imperative/makeSingleImperativeComponent.d.ts +15 -0
- package/dist/imperative/makeSingleImperativeComponent.d.ts.map +1 -0
- package/dist/imperative/makeSingleImperativeComponent.js +31 -0
- package/dist/imperative/makeSingleImperativeComponent.js.map +1 -0
- package/dist/imperative/types.d.ts +22 -0
- package/dist/imperative/types.d.ts.map +1 -0
- package/dist/imperative/types.js +8 -0
- package/dist/imperative/types.js.map +1 -0
- package/dist/imperative/useImperativeComponentEvents.d.ts +6 -0
- package/dist/imperative/useImperativeComponentEvents.d.ts.map +1 -0
- package/dist/imperative/useImperativeComponentEvents.js +35 -0
- package/dist/imperative/useImperativeComponentEvents.js.map +1 -0
- package/dist/imperative/useImperativeIdentifierContext.d.ts +14 -0
- package/dist/imperative/useImperativeIdentifierContext.d.ts.map +1 -0
- package/dist/imperative/useImperativeIdentifierContext.js +10 -0
- package/dist/imperative/useImperativeIdentifierContext.js.map +1 -0
- package/dist/index.d.ts +69 -1777
- package/dist/index.js +63 -2659
- package/dist/index.js.map +1 -1
- package/dist/labels/formatMessage.d.ts +19 -0
- package/dist/labels/formatMessage.d.ts.map +1 -0
- package/dist/labels/formatMessage.js +13 -0
- package/dist/labels/formatMessage.js.map +1 -0
- package/dist/labels/getLabel.d.ts +34 -0
- package/dist/labels/getLabel.d.ts.map +1 -0
- package/dist/labels/getLabel.js +18 -0
- package/dist/labels/getLabel.js.map +1 -0
- package/dist/number/index.d.ts +29 -0
- package/dist/number/index.d.ts.map +1 -0
- package/dist/number/index.js +43 -0
- package/dist/number/index.js.map +1 -0
- package/dist/objects/getValueByPath.d.ts +23 -0
- package/dist/objects/getValueByPath.d.ts.map +1 -0
- package/dist/objects/getValueByPath.js +19 -0
- package/dist/objects/getValueByPath.js.map +1 -0
- package/dist/objects/setValueByPath.d.ts +33 -0
- package/dist/objects/setValueByPath.d.ts.map +1 -0
- package/dist/objects/setValueByPath.js +35 -0
- package/dist/objects/setValueByPath.js.map +1 -0
- package/dist/propsStore/propsStore.d.ts +42 -0
- package/dist/propsStore/propsStore.d.ts.map +1 -0
- package/dist/propsStore/propsStore.js +157 -0
- package/dist/propsStore/propsStore.js.map +1 -0
- package/dist/propsStore/types.d.ts +24 -0
- package/dist/propsStore/types.d.ts.map +1 -0
- package/dist/propsStore/usePropsSelector.d.ts +67 -0
- package/dist/propsStore/usePropsSelector.d.ts.map +1 -0
- package/dist/propsStore/usePropsSelector.js +92 -0
- package/dist/propsStore/usePropsSelector.js.map +1 -0
- package/dist/screenLock/screenLocker.d.ts +60 -0
- package/dist/screenLock/screenLocker.d.ts.map +1 -0
- package/dist/screenLock/screenLocker.js +95 -0
- package/dist/screenLock/screenLocker.js.map +1 -0
- package/dist/states/useDebouncedState.d.ts +10 -0
- package/dist/states/useDebouncedState.d.ts.map +1 -0
- package/dist/states/useDebouncedState.js +22 -0
- package/dist/states/useDebouncedState.js.map +1 -0
- package/dist/states/useDomState.d.ts +86 -0
- package/dist/states/useDomState.d.ts.map +1 -0
- package/dist/states/useDomState.js +35 -0
- package/dist/states/useDomState.js.map +1 -0
- package/dist/storage/StatefulStore.d.ts +205 -0
- package/dist/storage/StatefulStore.d.ts.map +1 -0
- package/dist/storage/StatefulStore.js +301 -0
- package/dist/storage/StatefulStore.js.map +1 -0
- package/dist/storage/persistentStorage.d.ts +12 -0
- package/dist/storage/persistentStorage.d.ts.map +1 -0
- package/dist/storage/persistentStorage.js +28 -0
- package/dist/storage/persistentStorage.js.map +1 -0
- package/dist/storage/useLocalStorage.d.ts +7 -0
- package/dist/storage/useLocalStorage.d.ts.map +1 -0
- package/dist/storage/useLocalStorage.js +40 -0
- package/dist/storage/useLocalStorage.js.map +1 -0
- package/dist/string/alignment.d.ts +25 -0
- package/dist/string/alignment.d.ts.map +1 -0
- package/dist/string/alignment.js +26 -0
- package/dist/string/alignment.js.map +1 -0
- package/dist/string/ucfirst.d.ts +4 -0
- package/dist/string/ucfirst.d.ts.map +1 -0
- package/dist/string/ucfirst.js +6 -0
- package/dist/string/ucfirst.js.map +1 -0
- package/dist/typeGuards/toBoolean.d.ts +26 -0
- package/dist/typeGuards/toBoolean.d.ts.map +1 -0
- package/dist/typeGuards/toBoolean.js +11 -0
- package/dist/typeGuards/toBoolean.js.map +1 -0
- package/dist/types/apia/common.d.ts +114 -0
- package/dist/types/apia/common.d.ts.map +1 -0
- package/dist/types/apia/date.d.ts +4 -0
- package/dist/types/apia/date.d.ts.map +1 -0
- package/dist/types/apia/forms.d.ts +221 -0
- package/dist/types/apia/forms.d.ts.map +1 -0
- package/dist/types/misc.d.ts +9 -0
- package/dist/types/misc.d.ts.map +1 -0
- package/dist/xml/parseXmlAsync.d.ts +4 -0
- package/dist/xml/parseXmlAsync.d.ts.map +1 -0
- package/dist/xml/parseXmlAsync.js +58 -0
- package/dist/xml/parseXmlAsync.js.map +1 -0
- package/package.json +24 -35
- package/LICENSE.md +0 -21
- package/README.md +0 -18
- package/cleanDist.json +0 -3
- package/entries.json +0 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface IParameter {
|
|
2
|
+
name: string;
|
|
3
|
+
value: unknown;
|
|
4
|
+
allowMultiple?: boolean;
|
|
5
|
+
}
|
|
6
|
+
declare class Url {
|
|
7
|
+
#private;
|
|
8
|
+
defaultAllowMultiple: boolean;
|
|
9
|
+
base: string;
|
|
10
|
+
constructor(baseUrl: string, defaultAllowMultiple?: boolean);
|
|
11
|
+
addParameter(name: string, value: unknown, allowMultiple?: boolean): void;
|
|
12
|
+
addParameters(parameters: IParameter[]): void;
|
|
13
|
+
getParameter(name: string): string | string[];
|
|
14
|
+
toString(): string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { type IParameter, Url };
|
|
18
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/dom/url.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import arrayOrArray from '../array/arrayOrArray.js';
|
|
2
|
+
|
|
3
|
+
var __accessCheck = (obj, member, msg) => {
|
|
4
|
+
if (!member.has(obj))
|
|
5
|
+
throw TypeError("Cannot " + msg);
|
|
6
|
+
};
|
|
7
|
+
var __privateGet = (obj, member, getter) => {
|
|
8
|
+
__accessCheck(obj, member, "read from private field");
|
|
9
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
10
|
+
};
|
|
11
|
+
var __privateAdd = (obj, member, value) => {
|
|
12
|
+
if (member.has(obj))
|
|
13
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
14
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
15
|
+
};
|
|
16
|
+
var _parameters;
|
|
17
|
+
class Url {
|
|
18
|
+
constructor(baseUrl, defaultAllowMultiple = true) {
|
|
19
|
+
this.defaultAllowMultiple = defaultAllowMultiple;
|
|
20
|
+
__privateAdd(this, _parameters, {});
|
|
21
|
+
const [base, query] = baseUrl.split("?");
|
|
22
|
+
this.base = base;
|
|
23
|
+
query?.split("&").forEach((current) => {
|
|
24
|
+
const [name, ...value] = current.split("=");
|
|
25
|
+
this.addParameter(name, value.join("="));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
addParameter(name, value, allowMultiple) {
|
|
29
|
+
if (allowMultiple === void 0 && !this.defaultAllowMultiple || allowMultiple === false)
|
|
30
|
+
__privateGet(this, _parameters)[name] = String(value);
|
|
31
|
+
else
|
|
32
|
+
__privateGet(this, _parameters)[name] = __privateGet(this, _parameters)[name] ? [...arrayOrArray(__privateGet(this, _parameters)[name]), String(value)] : [String(value)];
|
|
33
|
+
}
|
|
34
|
+
addParameters(parameters) {
|
|
35
|
+
parameters.forEach(
|
|
36
|
+
(current) => this.addParameter(current.name, current.value, current.allowMultiple)
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
getParameter(name) {
|
|
40
|
+
return __privateGet(this, _parameters)[name];
|
|
41
|
+
}
|
|
42
|
+
toString() {
|
|
43
|
+
const parametersArray = Object.entries(__privateGet(this, _parameters));
|
|
44
|
+
return `${this.base}${parametersArray.length > 0 ? `?${parametersArray.map(
|
|
45
|
+
([name, value]) => Array.isArray(value) ? value.map((current) => `${name}=${current}`).join("&") : `${name}=${String(value)}`
|
|
46
|
+
).join("&")}` : ""}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
_parameters = new WeakMap();
|
|
50
|
+
|
|
51
|
+
export { Url };
|
|
52
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sources":["../../src/dom/url.ts"],"sourcesContent":["import { arrayOrArray } from '../array';\n\nexport interface IParameter {\n name: string;\n value: unknown;\n allowMultiple?: boolean;\n}\n\nexport class Url {\n base: string;\n\n #parameters: Record<string, string | string[]> = {};\n\n constructor(baseUrl: string, public defaultAllowMultiple = true) {\n const [base, query] = baseUrl.split('?');\n this.base = base;\n query?.split('&').forEach((current) => {\n const [name, ...value] = current.split('=');\n this.addParameter(name, value.join('='));\n });\n }\n\n addParameter(name: string, value: unknown, allowMultiple?: boolean) {\n if (\n (allowMultiple === undefined && !this.defaultAllowMultiple) ||\n allowMultiple === false\n )\n this.#parameters[name] = String(value);\n else\n this.#parameters[name] = this.#parameters[name]\n ? [...arrayOrArray(this.#parameters[name]), String(value)]\n : [String(value)];\n }\n\n addParameters(parameters: IParameter[]) {\n parameters.forEach((current) =>\n this.addParameter(current.name, current.value, current.allowMultiple),\n );\n }\n\n getParameter(name: string) {\n return this.#parameters[name];\n }\n\n toString() {\n const parametersArray = Object.entries(this.#parameters);\n\n return `${this.base}${\n parametersArray.length > 0\n ? `?${parametersArray\n .map(([name, value]) =>\n Array.isArray(value)\n ? value.map((current) => `${name}=${current}`).join('&')\n : `${name}=${String(value)}`,\n )\n .join('&')}`\n : ''\n }`;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,IAAA,WAAA,CAAA;AAQO,MAAM,GAAI,CAAA;AAAA,EAKf,WAAA,CAAY,OAAwB,EAAA,oBAAA,GAAuB,IAAM,EAAA;AAA7B,IAAA,IAAA,CAAA,oBAAA,GAAA,oBAAA,CAAA;AAFpC,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAiD,EAAC,CAAA,CAAA;AAGhD,IAAA,MAAM,CAAC,IAAM,EAAA,KAAK,CAAI,GAAA,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAA;AACvC,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,IAAA,KAAA,EAAO,KAAM,CAAA,GAAG,CAAE,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AACrC,MAAA,MAAM,CAAC,IAAM,EAAA,GAAG,KAAK,CAAI,GAAA,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAA;AAC1C,MAAA,IAAA,CAAK,YAAa,CAAA,IAAA,EAAM,KAAM,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,KACxC,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,YAAA,CAAa,IAAc,EAAA,KAAA,EAAgB,aAAyB,EAAA;AAClE,IAAA,IACG,aAAkB,KAAA,KAAA,CAAA,IAAa,CAAC,IAAA,CAAK,wBACtC,aAAkB,KAAA,KAAA;AAElB,MAAA,YAAA,CAAA,IAAA,EAAK,WAAY,CAAA,CAAA,IAAI,CAAI,GAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA;AAErC,MAAK,YAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAY,IAAI,CAAI,GAAA,YAAA,CAAA,IAAA,EAAK,aAAY,IAAI,CAAA,GAC1C,CAAC,GAAG,YAAa,CAAA,YAAA,CAAA,IAAA,EAAK,aAAY,IAAI,CAAC,GAAG,MAAO,CAAA,KAAK,CAAC,CACvD,GAAA,CAAC,MAAO,CAAA,KAAK,CAAC,CAAA,CAAA;AAAA,GACtB;AAAA,EAEA,cAAc,UAA0B,EAAA;AACtC,IAAW,UAAA,CAAA,OAAA;AAAA,MAAQ,CAAC,YAClB,IAAK,CAAA,YAAA,CAAa,QAAQ,IAAM,EAAA,OAAA,CAAQ,KAAO,EAAA,OAAA,CAAQ,aAAa,CAAA;AAAA,KACtE,CAAA;AAAA,GACF;AAAA,EAEA,aAAa,IAAc,EAAA;AACzB,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,aAAY,IAAI,CAAA,CAAA;AAAA,GAC9B;AAAA,EAEA,QAAW,GAAA;AACT,IAAA,MAAM,eAAkB,GAAA,MAAA,CAAO,OAAQ,CAAA,YAAA,CAAA,IAAA,EAAK,WAAW,CAAA,CAAA,CAAA;AAEvD,IAAO,OAAA,CAAA,EAAG,KAAK,IAAI,CAAA,EACjB,gBAAgB,MAAS,GAAA,CAAA,GACrB,IAAI,eACD,CAAA,GAAA;AAAA,MAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAChB,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAA,GACf,KAAM,CAAA,GAAA,CAAI,CAAC,OAAA,KAAY,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,OAAO,CAAE,CAAA,CAAA,CAAE,IAAK,CAAA,GAAG,CACrD,GAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAO,CAAA,KAAK,CAAC,CAAA,CAAA;AAAA,KAE7B,CAAA,IAAA,CAAK,GAAG,CAAC,KACZ,EACN,CAAA,CAAA,CAAA;AAAA,GACF;AACF,CAAA;AAhDE,WAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
declare function usePanAndZoom<ContainerType extends HTMLElement = HTMLElement, ChildType extends HTMLElement | SVGElement = HTMLElement>(effectiveMargin?: {
|
|
4
|
+
left: number;
|
|
5
|
+
top: number;
|
|
6
|
+
right: number;
|
|
7
|
+
bottom: number;
|
|
8
|
+
}, blockZoom?: boolean): {
|
|
9
|
+
boxRef: React__default.RefObject<ContainerType>;
|
|
10
|
+
elementRef: React__default.RefObject<ChildType>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { usePanAndZoom };
|
|
14
|
+
//# sourceMappingURL=usePanAndZoom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePanAndZoom.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import React__default, { useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
function usePanAndZoom(effectiveMargin = { left: 0, bottom: 0, right: 0, top: 0 }, blockZoom = true) {
|
|
4
|
+
const boxRef = useRef(null);
|
|
5
|
+
const elementRef = useRef(null);
|
|
6
|
+
const [isPanning, setIsPanning] = React__default.useState(false);
|
|
7
|
+
const [panningPosition, setPanningPosition] = React__default.useState({ x: 0, y: 0 });
|
|
8
|
+
React__default.useEffect(() => {
|
|
9
|
+
if (blockZoom)
|
|
10
|
+
return;
|
|
11
|
+
const container = boxRef.current;
|
|
12
|
+
const innerElement = elementRef.current;
|
|
13
|
+
const handlePanStart = (ev) => {
|
|
14
|
+
ev.preventDefault();
|
|
15
|
+
setIsPanning(true);
|
|
16
|
+
setPanningPosition({ x: ev.clientX, y: ev.clientY });
|
|
17
|
+
};
|
|
18
|
+
const handlePanEnd = (ev) => {
|
|
19
|
+
ev.preventDefault();
|
|
20
|
+
setIsPanning(false);
|
|
21
|
+
};
|
|
22
|
+
const handlePan = (ev) => {
|
|
23
|
+
if (!innerElement || !container) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (isPanning) {
|
|
27
|
+
ev.preventDefault();
|
|
28
|
+
ev.stopPropagation();
|
|
29
|
+
const dx = ev.clientX - panningPosition.x;
|
|
30
|
+
const dy = ev.clientY - panningPosition.y;
|
|
31
|
+
container.scrollLeft -= dx;
|
|
32
|
+
container.scrollTop -= dy;
|
|
33
|
+
setPanningPosition({ x: ev.clientX, y: ev.clientY });
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
if (container) {
|
|
37
|
+
container.addEventListener("mousedown", handlePanStart);
|
|
38
|
+
container.addEventListener("mouseup", handlePanEnd);
|
|
39
|
+
container.addEventListener("mouseleave", handlePanEnd);
|
|
40
|
+
container.addEventListener("mousemove", handlePan);
|
|
41
|
+
return () => {
|
|
42
|
+
container.removeEventListener("mousedown", handlePanStart);
|
|
43
|
+
container.removeEventListener("mousemove", handlePan);
|
|
44
|
+
container.removeEventListener("mouseup", handlePanEnd);
|
|
45
|
+
container.removeEventListener("mouseleave", handlePanEnd);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}, [isPanning, panningPosition]);
|
|
49
|
+
React__default.useEffect(() => {
|
|
50
|
+
if (blockZoom)
|
|
51
|
+
return;
|
|
52
|
+
const container = boxRef.current;
|
|
53
|
+
const innerElement = elementRef.current;
|
|
54
|
+
let newScale = 1;
|
|
55
|
+
const handleZoom = (ev) => {
|
|
56
|
+
ev.preventDefault();
|
|
57
|
+
const newDelta = ev.deltaY;
|
|
58
|
+
const scaleIncrement = 0.1;
|
|
59
|
+
if (newDelta < 0) {
|
|
60
|
+
if (newScale + scaleIncrement >= 2) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
newScale += scaleIncrement;
|
|
64
|
+
} else {
|
|
65
|
+
if (newScale - scaleIncrement <= 0.9) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
newScale -= scaleIncrement;
|
|
69
|
+
}
|
|
70
|
+
if (!innerElement || !container) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const containerRect = container.getBoundingClientRect();
|
|
74
|
+
const cursorX = ev.clientX - containerRect.left - effectiveMargin.left;
|
|
75
|
+
const cursorY = ev.clientY - containerRect.top - effectiveMargin.top;
|
|
76
|
+
const cursorXFromCenter = cursorX - containerRect.width / 2;
|
|
77
|
+
const cursorYFromCenter = cursorY - containerRect.height / 2;
|
|
78
|
+
if (newScale <= 1) {
|
|
79
|
+
if (boxRef.current) {
|
|
80
|
+
boxRef.current.style.overflow = "hidden";
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
if (boxRef.current) {
|
|
84
|
+
boxRef.current.style.overflow = "hidden";
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
innerElement.style.transform = `scale(${newScale})`;
|
|
88
|
+
innerElement.style.transformOrigin = "0px 0px";
|
|
89
|
+
if (newDelta < 0) {
|
|
90
|
+
container.scrollLeft += cursorXFromCenter / (newScale * 2);
|
|
91
|
+
container.scrollTop += cursorYFromCenter / (newScale * 2);
|
|
92
|
+
} else {
|
|
93
|
+
container.scrollLeft -= cursorXFromCenter / (newScale * 2);
|
|
94
|
+
container.scrollTop -= cursorYFromCenter / (newScale * 2);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
if (container) {
|
|
98
|
+
container.addEventListener("wheel", handleZoom);
|
|
99
|
+
return () => {
|
|
100
|
+
container.removeEventListener("wheel", handleZoom);
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}, []);
|
|
104
|
+
return {
|
|
105
|
+
boxRef,
|
|
106
|
+
elementRef
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export { usePanAndZoom };
|
|
111
|
+
//# sourceMappingURL=usePanAndZoom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePanAndZoom.js","sources":["../../src/dom/usePanAndZoom.ts"],"sourcesContent":["import React, { useRef } from 'react';\n\nexport function usePanAndZoom<\n ContainerType extends HTMLElement = HTMLElement,\n ChildType extends HTMLElement | SVGElement = HTMLElement,\n>(\n effectiveMargin: {\n left: number;\n top: number;\n right: number;\n bottom: number;\n } = { left: 0, bottom: 0, right: 0, top: 0 },\n blockZoom = true,\n) {\n const boxRef = useRef<ContainerType>(null);\n const elementRef = useRef<ChildType>(null);\n const [isPanning, setIsPanning] = React.useState(false);\n const [panningPosition, setPanningPosition] = React.useState({ x: 0, y: 0 });\n\n React.useEffect(() => {\n if (blockZoom) return;\n const container = boxRef.current;\n const innerElement = elementRef.current;\n const handlePanStart = (ev: MouseEvent) => {\n ev.preventDefault();\n setIsPanning(true);\n setPanningPosition({ x: ev.clientX, y: ev.clientY });\n };\n const handlePanEnd = (ev: MouseEvent) => {\n ev.preventDefault();\n\n setIsPanning(false);\n };\n\n const handlePan = (ev: MouseEvent) => {\n if (!innerElement || !container) {\n return;\n }\n\n if (isPanning) {\n ev.preventDefault();\n ev.stopPropagation();\n\n const dx = ev.clientX - panningPosition.x;\n const dy = ev.clientY - panningPosition.y;\n\n container.scrollLeft -= dx;\n container.scrollTop -= dy;\n\n setPanningPosition({ x: ev.clientX, y: ev.clientY });\n }\n };\n\n if (container) {\n container.addEventListener('mousedown', handlePanStart);\n container.addEventListener('mouseup', handlePanEnd);\n container.addEventListener('mouseleave', handlePanEnd);\n container.addEventListener('mousemove', handlePan);\n return () => {\n container.removeEventListener('mousedown', handlePanStart);\n container.removeEventListener('mousemove', handlePan);\n container.removeEventListener('mouseup', handlePanEnd);\n container.removeEventListener('mouseleave', handlePanEnd);\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isPanning, panningPosition]);\n\n React.useEffect(() => {\n if (blockZoom) return;\n\n const container = boxRef.current;\n const innerElement = elementRef.current;\n let newScale = 1;\n const handleZoom = (ev: WheelEvent) => {\n ev.preventDefault();\n\n const newDelta = ev.deltaY;\n const scaleIncrement = 0.1;\n\n if (newDelta < 0) {\n if (newScale + scaleIncrement >= 2) {\n return;\n }\n newScale += scaleIncrement;\n } else {\n if (newScale - scaleIncrement <= 0.9) {\n return;\n }\n newScale -= scaleIncrement;\n }\n if (!innerElement || !container) {\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const cursorX = ev.clientX - containerRect.left - effectiveMargin.left;\n const cursorY = ev.clientY - containerRect.top - effectiveMargin.top;\n\n const cursorXFromCenter = cursorX - containerRect.width / 2;\n const cursorYFromCenter = cursorY - containerRect.height / 2;\n\n if (newScale <= 1) {\n if (boxRef.current) {\n boxRef.current.style.overflow = 'hidden';\n }\n } else {\n if (boxRef.current) {\n boxRef.current.style.overflow = 'hidden';\n }\n }\n innerElement.style.transform = `scale(${newScale})`;\n innerElement.style.transformOrigin = '0px 0px';\n\n if (newDelta < 0) {\n container.scrollLeft += cursorXFromCenter / (newScale * 2);\n container.scrollTop += cursorYFromCenter / (newScale * 2);\n } else {\n container.scrollLeft -= cursorXFromCenter / (newScale * 2);\n container.scrollTop -= cursorYFromCenter / (newScale * 2);\n }\n };\n if (container) {\n container.addEventListener('wheel', handleZoom);\n return () => {\n container.removeEventListener('wheel', handleZoom);\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return {\n boxRef,\n elementRef,\n };\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toma una cadena de texto que puede tener caracteres de escape de HTML (por
|
|
3
|
+
* ejemplo á) y devuelve su correspondiente en texto plano.
|
|
4
|
+
*/
|
|
5
|
+
declare const decodeHTMLEntities: (str: string) => string | null;
|
|
6
|
+
|
|
7
|
+
export { decodeHTMLEntities };
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const decodeHTMLEntities = (str) => {
|
|
2
|
+
const parser = new DOMParser();
|
|
3
|
+
const dom = parser.parseFromString(
|
|
4
|
+
"<!doctype html><body>" + str,
|
|
5
|
+
"text/html"
|
|
6
|
+
);
|
|
7
|
+
const decodedString = dom.body.textContent;
|
|
8
|
+
return decodedString;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { decodeHTMLEntities };
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/encoding/index.ts"],"sourcesContent":["/**\n * Toma una cadena de texto que puede tener caracteres de escape de HTML (por\n * ejemplo á) y devuelve su correspondiente en texto plano.\n */\nexport const decodeHTMLEntities = (str: string) => {\n const parser = new DOMParser();\n const dom = parser.parseFromString(\n '<!doctype html><body>' + str,\n 'text/html',\n );\n const decodedString = dom.body.textContent;\n return decodedString;\n};\n"],"names":[],"mappings":"AAIa,MAAA,kBAAA,GAAqB,CAAC,GAAgB,KAAA;AACjD,EAAM,MAAA,MAAA,GAAS,IAAI,SAAU,EAAA,CAAA;AAC7B,EAAA,MAAM,MAAM,MAAO,CAAA,eAAA;AAAA,IACjB,uBAA0B,GAAA,GAAA;AAAA,IAC1B,WAAA;AAAA,GACF,CAAA;AACA,EAAM,MAAA,aAAA,GAAgB,IAAI,IAAK,CAAA,WAAA,CAAA;AAC/B,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { SetStateAction } from 'react';
|
|
2
|
+
import { Map } from './types.js';
|
|
3
|
+
import { StatefulEmitter } from './StatefulEmitter.js';
|
|
4
|
+
|
|
5
|
+
type BouncingMap<Events extends Map> = {
|
|
6
|
+
[K in keyof Events]: number;
|
|
7
|
+
};
|
|
8
|
+
declare const NullObject: unique symbol;
|
|
9
|
+
type ThrottlingMap<Events extends Map> = {
|
|
10
|
+
[K in keyof Events]: Events[K] | typeof NullObject;
|
|
11
|
+
};
|
|
12
|
+
type ThrottlingMarkers<Events extends Map> = {
|
|
13
|
+
[K in keyof Events]: boolean;
|
|
14
|
+
};
|
|
15
|
+
type DebounceOptions = Partial<{
|
|
16
|
+
timing: number;
|
|
17
|
+
}>;
|
|
18
|
+
type ThrottleOptions = Partial<{
|
|
19
|
+
emitOnStart?: boolean;
|
|
20
|
+
timing: number;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* @public
|
|
24
|
+
*
|
|
25
|
+
* The BouncingEmitter class is an extension of EventEmitter which adds debouncing and throttling functionality.
|
|
26
|
+
*
|
|
27
|
+
* @typeParam — Events - An extension of Map where the key is the event name and the value is the type of data associated with that event.
|
|
28
|
+
*/
|
|
29
|
+
declare class BouncingEmitter<Events extends Map> extends StatefulEmitter<Events> {
|
|
30
|
+
protected bouncingTimeouts: BouncingMap<Events>;
|
|
31
|
+
protected defaultTiming: number;
|
|
32
|
+
/**
|
|
33
|
+
* Debounces a event emit with until there is no call to the emit methods by (timing)ms. Take the following event throttling, where each E is a call to this method and each character represents 20ms:
|
|
34
|
+
*
|
|
35
|
+
* E_E_E_E_E_E_E_E_E
|
|
36
|
+
*
|
|
37
|
+
* If timing is configured to 100ms, which is the default, the emission will occur as follows:
|
|
38
|
+
*
|
|
39
|
+
* _____________________E
|
|
40
|
+
*/
|
|
41
|
+
debounce<K extends keyof Events>(event: K, data: Events[K], configuration?: DebounceOptions): void;
|
|
42
|
+
/**
|
|
43
|
+
* Throttles a event emit with the warranty that the data will be emitted at most every (timing)ms. Take the following event throttling, where each E is a call to this method and each character represents 20ms:
|
|
44
|
+
*
|
|
45
|
+
* E_E_E_E_E_E_E_E_E
|
|
46
|
+
*
|
|
47
|
+
* If timing is configured to 100ms, which is the default, the emission will occur as follows:
|
|
48
|
+
*
|
|
49
|
+
* ____E____E____E______E
|
|
50
|
+
*
|
|
51
|
+
* @param configuration.emitOnStart - Emits an event on the first call to throttle when no pending throttle is stored. **If emitOnStart is true and an only call to throttle is made, it will emit an only event.**
|
|
52
|
+
*/
|
|
53
|
+
protected throttleData: ThrottlingMap<Events>;
|
|
54
|
+
protected throttleEmittedOnInit: ThrottlingMarkers<Events>;
|
|
55
|
+
throttle<K extends keyof Events>(event: K, data: Events[K], configuration?: ThrottleOptions): void;
|
|
56
|
+
/**
|
|
57
|
+
* This method is a mix between setState and debounce
|
|
58
|
+
*/
|
|
59
|
+
setStateDebounced<K extends keyof Events>(event: K, data: SetStateAction<Events[K]>, configuration?: DebounceOptions): void;
|
|
60
|
+
/**
|
|
61
|
+
* This method is a mix between setState and throttle
|
|
62
|
+
*/
|
|
63
|
+
setStateThrottled<K extends keyof Events>(event: K, data: SetStateAction<Events[K]>, configuration?: ThrottleOptions): void;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export { BouncingEmitter, type DebounceOptions, type ThrottleOptions };
|
|
67
|
+
//# sourceMappingURL=BouncingEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BouncingEmitter.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { StatefulEmitter, isSetter } from './StatefulEmitter.js';
|
|
2
|
+
|
|
3
|
+
const NullObject = Symbol("NullObject");
|
|
4
|
+
class BouncingEmitter extends StatefulEmitter {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.bouncingTimeouts = {};
|
|
8
|
+
this.defaultTiming = 100;
|
|
9
|
+
/**
|
|
10
|
+
* Throttles a event emit with the warranty that the data will be emitted at most every (timing)ms. Take the following event throttling, where each E is a call to this method and each character represents 20ms:
|
|
11
|
+
*
|
|
12
|
+
* E_E_E_E_E_E_E_E_E
|
|
13
|
+
*
|
|
14
|
+
* If timing is configured to 100ms, which is the default, the emission will occur as follows:
|
|
15
|
+
*
|
|
16
|
+
* ____E____E____E______E
|
|
17
|
+
*
|
|
18
|
+
* @param configuration.emitOnStart - Emits an event on the first call to throttle when no pending throttle is stored. **If emitOnStart is true and an only call to throttle is made, it will emit an only event.**
|
|
19
|
+
*/
|
|
20
|
+
this.throttleData = {};
|
|
21
|
+
this.throttleEmittedOnInit = {};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Debounces a event emit with until there is no call to the emit methods by (timing)ms. Take the following event throttling, where each E is a call to this method and each character represents 20ms:
|
|
25
|
+
*
|
|
26
|
+
* E_E_E_E_E_E_E_E_E
|
|
27
|
+
*
|
|
28
|
+
* If timing is configured to 100ms, which is the default, the emission will occur as follows:
|
|
29
|
+
*
|
|
30
|
+
* _____________________E
|
|
31
|
+
*/
|
|
32
|
+
debounce(event, data, configuration) {
|
|
33
|
+
clearTimeout(this.bouncingTimeouts[event]);
|
|
34
|
+
this.bouncingTimeouts[event] = setTimeout(() => {
|
|
35
|
+
this.emit(event, data);
|
|
36
|
+
}, configuration?.timing ?? this.defaultTiming);
|
|
37
|
+
}
|
|
38
|
+
throttle(event, data, configuration) {
|
|
39
|
+
if (!this.throttleEmittedOnInit[event] && configuration?.emitOnStart) {
|
|
40
|
+
this.throttleEmittedOnInit[event] = true;
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
this.throttleEmittedOnInit[event] = false;
|
|
43
|
+
}, configuration?.timing ?? this.defaultTiming);
|
|
44
|
+
this.emit(event, data);
|
|
45
|
+
} else if (!configuration?.emitOnStart) {
|
|
46
|
+
if (this.throttleData[event] === NullObject || !(event in this.throttleData)) {
|
|
47
|
+
setTimeout(() => {
|
|
48
|
+
this.emit(event, this.throttleData[event]);
|
|
49
|
+
this.throttleData[event] = NullObject;
|
|
50
|
+
}, configuration?.timing ?? this.defaultTiming);
|
|
51
|
+
}
|
|
52
|
+
this.throttleData[event] = data;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* This method is a mix between setState and debounce
|
|
57
|
+
*/
|
|
58
|
+
setStateDebounced(event, data, configuration) {
|
|
59
|
+
const actualData = isSetter(data) ? data(this.getState(event)) : data;
|
|
60
|
+
this.debounce(event, actualData, configuration);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* This method is a mix between setState and throttle
|
|
64
|
+
*/
|
|
65
|
+
setStateThrottled(event, data, configuration) {
|
|
66
|
+
const actualData = isSetter(data) ? data(this.getState(event)) : data;
|
|
67
|
+
this.throttle(event, actualData, configuration);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { BouncingEmitter };
|
|
72
|
+
//# sourceMappingURL=BouncingEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BouncingEmitter.js","sources":["../../src/events/BouncingEmitter.ts"],"sourcesContent":["import { SetStateAction } from 'react';\r\nimport { Map } from './EventEmitter';\r\nimport { StatefulEmitter, isSetter } from './StatefulEmitter';\r\n\r\ntype BouncingMap<Events extends Map> = {\r\n [K in keyof Events]: number;\r\n};\r\n\r\nconst NullObject = Symbol('NullObject');\r\n\r\ntype ThrottlingMap<Events extends Map> = {\r\n [K in keyof Events]: Events[K] | typeof NullObject;\r\n};\r\n\r\ntype ThrottlingMarkers<Events extends Map> = {\r\n [K in keyof Events]: boolean;\r\n};\r\n\r\nexport type DebounceOptions = Partial<{ timing: number }>;\r\n\r\nexport type ThrottleOptions = Partial<{\r\n emitOnStart?: boolean;\r\n timing: number;\r\n}>;\r\n\r\n/**\r\n * @public\r\n *\r\n * The BouncingEmitter class is an extension of EventEmitter which adds debouncing and throttling functionality.\r\n *\r\n * @typeParam — Events - An extension of Map where the key is the event name and the value is the type of data associated with that event.\r\n */\r\nexport class BouncingEmitter<\r\n Events extends Map,\r\n> extends StatefulEmitter<Events> {\r\n protected bouncingTimeouts = {} as BouncingMap<Events>;\r\n\r\n protected defaultTiming = 100;\r\n\r\n /**\r\n * Debounces a event emit with until there is no call to the emit methods by (timing)ms. Take the following event throttling, where each E is a call to this method and each character represents 20ms:\r\n *\r\n * E_E_E_E_E_E_E_E_E\r\n *\r\n * If timing is configured to 100ms, which is the default, the emission will occur as follows:\r\n *\r\n * _____________________E\r\n */\r\n debounce<K extends keyof Events>(\r\n event: K,\r\n data: Events[K],\r\n configuration?: DebounceOptions,\r\n ) {\r\n clearTimeout(this.bouncingTimeouts[event]);\r\n this.bouncingTimeouts[event] = setTimeout(() => {\r\n this.emit(event, data);\r\n }, configuration?.timing ?? this.defaultTiming) as unknown as number;\r\n }\r\n\r\n /**\r\n * Throttles a event emit with the warranty that the data will be emitted at most every (timing)ms. Take the following event throttling, where each E is a call to this method and each character represents 20ms:\r\n *\r\n * E_E_E_E_E_E_E_E_E\r\n *\r\n * If timing is configured to 100ms, which is the default, the emission will occur as follows:\r\n *\r\n * ____E____E____E______E\r\n *\r\n * @param configuration.emitOnStart - Emits an event on the first call to throttle when no pending throttle is stored. **If emitOnStart is true and an only call to throttle is made, it will emit an only event.**\r\n */\r\n\r\n protected throttleData = {} as ThrottlingMap<Events>;\r\n protected throttleEmittedOnInit = {} as ThrottlingMarkers<Events>;\r\n throttle<K extends keyof Events>(\r\n event: K,\r\n data: Events[K],\r\n configuration?: ThrottleOptions,\r\n ) {\r\n if (!this.throttleEmittedOnInit[event] && configuration?.emitOnStart) {\r\n this.throttleEmittedOnInit[event] = true;\r\n setTimeout(() => {\r\n this.throttleEmittedOnInit[event] = false;\r\n }, configuration?.timing ?? this.defaultTiming);\r\n this.emit(event, data);\r\n } else if (!configuration?.emitOnStart) {\r\n if (\r\n this.throttleData[event] === NullObject ||\r\n !(event in this.throttleData)\r\n ) {\r\n setTimeout(() => {\r\n this.emit(event, this.throttleData[event] as Events[K]);\r\n this.throttleData[event] = NullObject;\r\n }, configuration?.timing ?? this.defaultTiming);\r\n }\r\n this.throttleData[event] = data;\r\n }\r\n }\r\n\r\n /**\r\n * This method is a mix between setState and debounce\r\n */\r\n setStateDebounced<K extends keyof Events>(\r\n event: K,\r\n data: SetStateAction<Events[K]>,\r\n configuration?: DebounceOptions,\r\n ): void {\r\n const actualData = isSetter(data) ? data(this.getState(event)) : data;\r\n\r\n this.debounce(event, actualData, configuration);\r\n }\r\n\r\n /**\r\n * This method is a mix between setState and throttle\r\n */\r\n setStateThrottled<K extends keyof Events>(\r\n event: K,\r\n data: SetStateAction<Events[K]>,\r\n configuration?: ThrottleOptions,\r\n ): void {\r\n const actualData = isSetter(data) ? data(this.getState(event)) : data;\r\n\r\n this.throttle(event, actualData, configuration);\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Map, Callbacks, Callback, UnSubscriber } from './types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @public
|
|
5
|
+
*
|
|
6
|
+
* The `EventEmitter` class is a generic utility for handling events. It allows subscribing to and emitting events.
|
|
7
|
+
* This class is generic and works with a `Map` where keys are event names and values are the types associated with those events.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam Events - An extension of `Map` where the key is the event name and the value is the type of data associated with that event.
|
|
10
|
+
*/
|
|
11
|
+
declare class EventEmitter<Events extends Map> {
|
|
12
|
+
protected callbacks: Record<'on' | 'once', Callbacks<Events>>;
|
|
13
|
+
protected enabled: boolean;
|
|
14
|
+
protected debugMode: boolean;
|
|
15
|
+
debug(enable?: boolean): void;
|
|
16
|
+
/**
|
|
17
|
+
* Emits an event with the given data. Any listeners subscribed to this event will be invoked with the passed data.
|
|
18
|
+
*
|
|
19
|
+
* @param event - The event name to emit.
|
|
20
|
+
* @param data - The data associated with the event. Its type is dependent on the event name.
|
|
21
|
+
*/
|
|
22
|
+
emit<K extends keyof Events>(event: K, data: Events[K]): void;
|
|
23
|
+
/**
|
|
24
|
+
* Reflects the current emitter state. A disabled state indicates that the emitter wont call listeners until its functionality gets enabled again.
|
|
25
|
+
*/
|
|
26
|
+
get isEnabled(): boolean;
|
|
27
|
+
off<K extends keyof Events>(event: K, cb: Callback<Events, K>): void;
|
|
28
|
+
/**
|
|
29
|
+
* Subscribes a callback function to an event. The callback is invoked each time the event is emitted.
|
|
30
|
+
*
|
|
31
|
+
* @param event - The event name to listen to.
|
|
32
|
+
* @param cb - The callback function to be invoked when the event is emitted.
|
|
33
|
+
* @returns A function to unsubscribe the event listener.
|
|
34
|
+
*/
|
|
35
|
+
on<K extends keyof Events>(event: K, cb: Callback<Events, K>): UnSubscriber;
|
|
36
|
+
/**
|
|
37
|
+
* Subscribes a callback function to an event for a single occurrence. After the event is emitted once, the listener is automatically removed.
|
|
38
|
+
*
|
|
39
|
+
* @param event - The event name to listen to for a single occurrence.
|
|
40
|
+
* @param cb - The callback function to be invoked when the event is emitted.
|
|
41
|
+
* @returns A function to unsubscribe the event listener.
|
|
42
|
+
*/
|
|
43
|
+
once<K extends keyof Events>(event: K, cb: Callback<Events, K>): UnSubscriber;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { Callback, EventEmitter, Map, UnSubscriber };
|
|
47
|
+
//# sourceMappingURL=EventEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventEmitter.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
class EventEmitter {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.callbacks = {
|
|
4
|
+
on: {},
|
|
5
|
+
once: {}
|
|
6
|
+
};
|
|
7
|
+
this.enabled = true;
|
|
8
|
+
this.debugMode = false;
|
|
9
|
+
}
|
|
10
|
+
debug(enable = true) {
|
|
11
|
+
this.debugMode = enable;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Emits an event with the given data. Any listeners subscribed to this event will be invoked with the passed data.
|
|
15
|
+
*
|
|
16
|
+
* @param event - The event name to emit.
|
|
17
|
+
* @param data - The data associated with the event. Its type is dependent on the event name.
|
|
18
|
+
*/
|
|
19
|
+
emit(event, data) {
|
|
20
|
+
this.callbacks.on[event]?.forEach((current) => current(data));
|
|
21
|
+
this.callbacks.once[event]?.forEach((current) => current(data));
|
|
22
|
+
this.callbacks.once[event] = [];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Reflects the current emitter state. A disabled state indicates that the emitter wont call listeners until its functionality gets enabled again.
|
|
26
|
+
*/
|
|
27
|
+
get isEnabled() {
|
|
28
|
+
return this.enabled;
|
|
29
|
+
}
|
|
30
|
+
off(event, cb) {
|
|
31
|
+
this.callbacks.on[event] = this.callbacks.on[event]?.filter(
|
|
32
|
+
(c) => c !== cb
|
|
33
|
+
);
|
|
34
|
+
this.callbacks.once[event] = this.callbacks.once[event]?.filter(
|
|
35
|
+
(c) => c !== cb
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Subscribes a callback function to an event. The callback is invoked each time the event is emitted.
|
|
40
|
+
*
|
|
41
|
+
* @param event - The event name to listen to.
|
|
42
|
+
* @param cb - The callback function to be invoked when the event is emitted.
|
|
43
|
+
* @returns A function to unsubscribe the event listener.
|
|
44
|
+
*/
|
|
45
|
+
on(event, cb) {
|
|
46
|
+
if (!this.callbacks.on[event])
|
|
47
|
+
this.callbacks.on[event] = [];
|
|
48
|
+
this.callbacks.on[event].push(cb);
|
|
49
|
+
return () => {
|
|
50
|
+
this.callbacks.on[event] = this.callbacks.on[event].filter(
|
|
51
|
+
(c) => c !== cb
|
|
52
|
+
);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Subscribes a callback function to an event for a single occurrence. After the event is emitted once, the listener is automatically removed.
|
|
57
|
+
*
|
|
58
|
+
* @param event - The event name to listen to for a single occurrence.
|
|
59
|
+
* @param cb - The callback function to be invoked when the event is emitted.
|
|
60
|
+
* @returns A function to unsubscribe the event listener.
|
|
61
|
+
*/
|
|
62
|
+
once(event, cb) {
|
|
63
|
+
if (!this.callbacks.once[event])
|
|
64
|
+
this.callbacks.once[event] = [];
|
|
65
|
+
this.callbacks.once[event].push(cb);
|
|
66
|
+
return () => {
|
|
67
|
+
this.callbacks.once[event] = this.callbacks.once[event].filter(
|
|
68
|
+
(c) => c !== cb
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { EventEmitter };
|
|
75
|
+
//# sourceMappingURL=EventEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventEmitter.js","sources":["../../src/events/EventEmitter.ts"],"sourcesContent":["import { Callback, Callbacks, Map, UnSubscriber } from './types';\n\nexport type { Callback, Map, UnSubscriber } from './types';\n\n/**\n * @public\n *\n * The `EventEmitter` class is a generic utility for handling events. It allows subscribing to and emitting events.\n * This class is generic and works with a `Map` where keys are event names and values are the types associated with those events.\n *\n * @typeParam Events - An extension of `Map` where the key is the event name and the value is the type of data associated with that event.\n */\nexport class EventEmitter<Events extends Map> {\n protected callbacks: Record<'on' | 'once', Callbacks<Events>> = {\n on: {} as Callbacks<Events>,\n once: {} as Callbacks<Events>,\n };\n protected enabled = true;\n\n protected debugMode = false;\n debug(enable = true) {\n this.debugMode = enable;\n }\n\n /**\n * Emits an event with the given data. Any listeners subscribed to this event will be invoked with the passed data.\n *\n * @param event - The event name to emit.\n * @param data - The data associated with the event. Its type is dependent on the event name.\n */\n emit<K extends keyof Events>(event: K, data: Events[K]) {\n this.callbacks.on[event]?.forEach((current) => current(data));\n\n this.callbacks.once[event]?.forEach((current) => current(data));\n this.callbacks.once[event] = [];\n }\n\n /**\n * Reflects the current emitter state. A disabled state indicates that the emitter wont call listeners until its functionality gets enabled again.\n */\n get isEnabled() {\n return this.enabled;\n }\n\n off<K extends keyof Events>(event: K, cb: Callback<Events, K>): void {\n this.callbacks.on[event] = this.callbacks.on[event]?.filter(\n (c) => c !== cb,\n );\n this.callbacks.once[event] = this.callbacks.once[event]?.filter(\n (c) => c !== cb,\n );\n }\n\n /**\n * Subscribes a callback function to an event. The callback is invoked each time the event is emitted.\n *\n * @param event - The event name to listen to.\n * @param cb - The callback function to be invoked when the event is emitted.\n * @returns A function to unsubscribe the event listener.\n */\n on<K extends keyof Events>(event: K, cb: Callback<Events, K>): UnSubscriber {\n if (!this.callbacks.on[event]) this.callbacks.on[event] = [];\n this.callbacks.on[event].push(cb);\n\n return () => {\n this.callbacks.on[event] = this.callbacks.on[event].filter(\n (c) => c !== cb,\n );\n };\n }\n\n /**\n * Subscribes a callback function to an event for a single occurrence. After the event is emitted once, the listener is automatically removed.\n *\n * @param event - The event name to listen to for a single occurrence.\n * @param cb - The callback function to be invoked when the event is emitted.\n * @returns A function to unsubscribe the event listener.\n */\n once<K extends keyof Events>(\n event: K,\n cb: Callback<Events, K>,\n ): UnSubscriber {\n if (!this.callbacks.once[event]) this.callbacks.once[event] = [];\n this.callbacks.once[event].push(cb);\n\n return () => {\n this.callbacks.once[event] = this.callbacks.once[event].filter(\n (c) => c !== cb,\n );\n };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SetStateAction } from 'react';
|
|
2
|
+
import { EventEmitter } from './EventEmitter.js';
|
|
3
|
+
import { Map, Callback, UnSubscriber } from './types.js';
|
|
4
|
+
|
|
5
|
+
type Setter<T> = (prevState: T) => T;
|
|
6
|
+
declare function isSetter<T>(data: SetStateAction<T>): data is Setter<T>;
|
|
7
|
+
/**
|
|
8
|
+
* @private
|
|
9
|
+
*/
|
|
10
|
+
type EmitterState<Events extends Map> = {
|
|
11
|
+
[K in keyof Events]: Events[K];
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Extends EventEmitter to manage and emit events with state persistence.
|
|
15
|
+
* This class allows emitting and listening to typed events while also keeping
|
|
16
|
+
* a state that can be accessed synchronously for each event.
|
|
17
|
+
*
|
|
18
|
+
* @param initialState - If given will be passed to subscriptions
|
|
19
|
+
*
|
|
20
|
+
* @template Events - A mapping of event names to their associated data types.
|
|
21
|
+
* @extends EventEmitter<Events>
|
|
22
|
+
*/
|
|
23
|
+
declare class StatefulEmitter<Events extends Map> extends EventEmitter<Events> {
|
|
24
|
+
protected state: EmitterState<Events>;
|
|
25
|
+
constructor(initialState?: Partial<Events>);
|
|
26
|
+
emit<K extends keyof Events>(event: K, data: Events[K]): void;
|
|
27
|
+
on<K extends keyof Events>(event: K, cb: Callback<Events, K>): UnSubscriber;
|
|
28
|
+
once<K extends keyof Events>(event: K, cb: Callback<Events, K>): UnSubscriber;
|
|
29
|
+
/**
|
|
30
|
+
* Retrieves the stored state for a given event
|
|
31
|
+
*/
|
|
32
|
+
getState<K extends keyof Events>(event: K): EmitterState<Events>[K];
|
|
33
|
+
/**
|
|
34
|
+
* Just an alias for emit, with the advantage that can be called with a callback as second parameter in which case behaves exactly as react's setState.
|
|
35
|
+
*/
|
|
36
|
+
setState<K extends keyof Events>(event: K, data: SetStateAction<Events[K]>): void;
|
|
37
|
+
/**
|
|
38
|
+
* Allows to consume an event stream as a real time updated state
|
|
39
|
+
*/
|
|
40
|
+
useState: <K extends keyof Events>(event: K) => EmitterState<Events>[K];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { StatefulEmitter, isSetter };
|
|
44
|
+
//# sourceMappingURL=StatefulEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatefulEmitter.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|