@fivelab/web-utils 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +9 -1
  2. package/dist/behaviors/confirm.d.ts +4 -0
  3. package/dist/behaviors/confirm.js +18 -0
  4. package/dist/behaviors/confirm.js.map +1 -0
  5. package/dist/behaviors/copy.d.ts +7 -0
  6. package/dist/behaviors/copy.js +22 -0
  7. package/dist/behaviors/copy.js.map +1 -0
  8. package/dist/behaviors/index.d.ts +3 -0
  9. package/dist/behaviors/index.js +4 -0
  10. package/dist/{index.js.map → behaviors/index.js.map} +1 -1
  11. package/dist/behaviors/processing.d.ts +4 -0
  12. package/dist/behaviors/processing.js +43 -0
  13. package/dist/behaviors/processing.js.map +1 -0
  14. package/dist/browser/clipboard.d.ts +1 -0
  15. package/dist/browser/clipboard.js +17 -0
  16. package/dist/browser/clipboard.js.map +1 -0
  17. package/dist/browser/index.d.ts +4 -0
  18. package/dist/browser/index.js +8 -0
  19. package/dist/browser/index.js.map +1 -0
  20. package/dist/browser/navigation.d.ts +1 -0
  21. package/dist/browser/navigation.js +6 -0
  22. package/dist/browser/navigation.js.map +1 -0
  23. package/dist/browser/network.d.ts +7 -0
  24. package/dist/browser/network.js +8 -0
  25. package/dist/browser/network.js.map +1 -0
  26. package/dist/browser/notifications/adapter.d.ts +8 -0
  27. package/dist/browser/notifications/adapter.js +13 -0
  28. package/dist/browser/notifications/adapter.js.map +1 -0
  29. package/dist/browser/notifications/notyf.d.ts +2 -0
  30. package/dist/browser/notifications/notyf.js +64 -0
  31. package/dist/browser/notifications/notyf.js.map +1 -0
  32. package/dist/browser/notifications/toastr.d.ts +4 -0
  33. package/dist/browser/notifications/toastr.js +30 -0
  34. package/dist/browser/notifications/toastr.js.map +1 -0
  35. package/dist/browser/notifications.d.ts +10 -0
  36. package/dist/browser/notifications.js +31 -0
  37. package/dist/browser/notifications.js.map +1 -0
  38. package/dist/browser/request.d.ts +14 -0
  39. package/dist/browser/request.js +78 -0
  40. package/dist/browser/request.js.map +1 -0
  41. package/dist/dom/attributes.d.ts +4 -0
  42. package/dist/dom/attributes.js +16 -0
  43. package/dist/dom/attributes.js.map +1 -0
  44. package/dist/dom/{dom-changes.d.ts → changes.d.ts} +2 -2
  45. package/dist/dom/{dom-changes.js → changes.js} +2 -2
  46. package/dist/dom/changes.js.map +1 -0
  47. package/dist/dom/classes.d.ts +2 -0
  48. package/dist/dom/classes.js +9 -0
  49. package/dist/dom/classes.js.map +1 -0
  50. package/dist/dom/embedded-data.d.ts +5 -0
  51. package/dist/dom/embedded-data.js +21 -0
  52. package/dist/dom/embedded-data.js.map +1 -0
  53. package/dist/dom/events.d.ts +18 -0
  54. package/dist/dom/{dom-events.js → events.js} +2 -2
  55. package/dist/dom/events.js.map +1 -0
  56. package/dist/dom/index.d.ts +7 -0
  57. package/dist/dom/index.js +8 -0
  58. package/dist/dom/index.js.map +1 -0
  59. package/dist/dom/{dom-ready.js → ready.js} +1 -1
  60. package/dist/dom/ready.js.map +1 -0
  61. package/dist/dom/state.d.ts +3 -0
  62. package/dist/dom/state.js +14 -0
  63. package/dist/dom/state.js.map +1 -0
  64. package/dist/dom/visibility.d.ts +2 -0
  65. package/dist/dom/visibility.js +18 -0
  66. package/dist/dom/visibility.js.map +1 -0
  67. package/dist/observability/index.d.ts +1 -0
  68. package/dist/observability/index.js +3 -0
  69. package/dist/observability/index.js.map +1 -0
  70. package/dist/observability/sentry/integrations.d.ts +2 -0
  71. package/dist/observability/sentry/integrations.js +25 -0
  72. package/dist/observability/sentry/integrations.js.map +1 -0
  73. package/dist/observability/sentry/sentry.d.ts +14 -0
  74. package/dist/observability/sentry/sentry.js +93 -0
  75. package/dist/observability/sentry/sentry.js.map +1 -0
  76. package/dist/ui/index.d.ts +1 -0
  77. package/dist/ui/index.js +2 -0
  78. package/dist/ui/index.js.map +1 -0
  79. package/dist/ui/spinner.d.ts +1 -0
  80. package/dist/ui/spinner.js +14 -0
  81. package/dist/ui/spinner.js.map +1 -0
  82. package/package.json +57 -4
  83. package/dist/dom/dom-changes.js.map +0 -1
  84. package/dist/dom/dom-events.d.ts +0 -18
  85. package/dist/dom/dom-events.js.map +0 -1
  86. package/dist/dom/dom-ready.js.map +0 -1
  87. package/dist/dom/dom-visibility.d.ts +0 -2
  88. package/dist/dom/dom-visibility.js +0 -9
  89. package/dist/dom/dom-visibility.js.map +0 -1
  90. package/dist/index.d.ts +0 -4
  91. package/dist/index.js +0 -5
  92. /package/dist/dom/{dom-ready.d.ts → ready.d.ts} +0 -0
package/README.md CHANGED
@@ -6,5 +6,13 @@ Development
6
6
 
7
7
  ```shell
8
8
  docker build -t web-utils .
9
- docker run -it -v $(pwd):/code web-utils bash
9
+ docker run -it -v $(pwd):/code -p 5173:5173 web-utils bash
10
10
  ```
11
+
12
+ Build & Publish
13
+ ---------------
14
+
15
+ ```shell
16
+ npm version X.X.X --no-git-tag-version
17
+ npm publish
18
+ ```
@@ -0,0 +1,4 @@
1
+ import { DomEventCallback } from '../dom';
2
+ export declare const kAttrHref = "data-href";
3
+ export declare const kAttrConfirm = "data-confirm";
4
+ export declare const confirmBehavior: DomEventCallback<HTMLElement>;
@@ -0,0 +1,18 @@
1
+ import { navigateTo } from '../browser/navigation.js';
2
+
3
+ const kAttrHref = 'data-href';
4
+ const kAttrConfirm = 'data-confirm';
5
+ const confirmBehavior = (element, event) => {
6
+ event.preventDefault();
7
+ const href = element.getAttribute(kAttrHref);
8
+ const message = element.getAttribute(kAttrConfirm) || 'Are you sure want?';
9
+ if (!href) {
10
+ throw new Error(`Can't process data confirm. Missed "${kAttrHref}" attribute.`);
11
+ }
12
+ if (confirm(message)) {
13
+ navigateTo(href);
14
+ }
15
+ };
16
+
17
+ export { confirmBehavior, kAttrConfirm, kAttrHref };
18
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sources":["../../src/behaviors/confirm.ts"],"sourcesContent":["import { navigateTo } from '../browser/navigation';\nimport { DomEventCallback } from '../dom';\n\nexport const kAttrHref = 'data-href';\nexport const kAttrConfirm = 'data-confirm';\n\nexport const confirmBehavior: DomEventCallback<HTMLElement> = (element: HTMLElement, event: Event): void => {\n event.preventDefault();\n\n const href = element.getAttribute(kAttrHref);\n const message = element.getAttribute(kAttrConfirm) || 'Are you sure want?';\n\n if (!href) {\n throw new Error(`Can't process data confirm. Missed \"${kAttrHref}\" attribute.`);\n }\n\n if (confirm(message)) {\n navigateTo(href);\n }\n};\n"],"names":[],"mappings":";;AAGO,MAAM,SAAS,GAAG;AAClB,MAAM,YAAY,GAAG;MAEf,eAAe,GAAkC,CAAC,OAAoB,EAAE,KAAY,KAAU;IACvG,KAAK,CAAC,cAAc,EAAE;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,oBAAoB;IAE1E,IAAI,CAAC,IAAI,EAAE;AACP,QAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,CAAA,YAAA,CAAc,CAAC;IACnF;AAEA,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAClB,UAAU,CAAC,IAAI,CAAC;IACpB;AACJ;;;;"}
@@ -0,0 +1,7 @@
1
+ import { DomEventCallback } from '../dom';
2
+ export type CopyBehaviorOptions = {
3
+ success?: (text: string, element: HTMLElement) => void;
4
+ };
5
+ export declare const kAttrCopy = "data-copy";
6
+ export declare const kAttrMessage = "data-copy-message";
7
+ export declare const createCopyBehavior: (options?: CopyBehaviorOptions) => DomEventCallback<HTMLElement>;
@@ -0,0 +1,22 @@
1
+ import { readStringAttribute } from '../dom/attributes.js';
2
+ import { copyToClipboard } from '../browser/clipboard.js';
3
+
4
+ const kAttrCopy = 'data-copy';
5
+ const kAttrMessage = 'data-copy-message';
6
+ const copyBehavior = async (element, event) => {
7
+ if (element.nodeName.toLowerCase() === 'a' && element.getAttribute('href') === '#') {
8
+ event.preventDefault();
9
+ }
10
+ const data = readStringAttribute(element, kAttrCopy);
11
+ await copyToClipboard(data);
12
+ };
13
+ const createCopyBehavior = (options) => {
14
+ return async (el, ev) => {
15
+ await copyBehavior(el, ev);
16
+ const message = readStringAttribute(el, kAttrMessage, 'Success copy to clipboard.');
17
+ options?.success?.(message, el);
18
+ };
19
+ };
20
+
21
+ export { createCopyBehavior, kAttrCopy, kAttrMessage };
22
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sources":["../../src/behaviors/copy.ts"],"sourcesContent":["import { copyToClipboard } from '../browser';\nimport { DomEventCallback, readStringAttribute } from '../dom';\n\nexport type CopyBehaviorOptions = {\n success?: (text: string, element: HTMLElement) => void;\n};\n\nexport const kAttrCopy = 'data-copy';\nexport const kAttrMessage = 'data-copy-message';\n\nconst copyBehavior: DomEventCallback<HTMLElement> = async (element: HTMLElement, event: Event) => {\n if (element.nodeName.toLowerCase() === 'a' && element.getAttribute('href') === '#') {\n event.preventDefault();\n }\n\n const data = readStringAttribute(element, kAttrCopy);\n\n await copyToClipboard(data);\n};\n\nexport const createCopyBehavior = (options?: CopyBehaviorOptions): DomEventCallback<HTMLElement> => {\n return async (el: HTMLElement, ev: Event) => {\n await copyBehavior(el, ev);\n\n const message = readStringAttribute(el, kAttrMessage, 'Success copy to clipboard.');\n options?.success?.(message, el);\n };\n};\n"],"names":[],"mappings":";;;AAOO,MAAM,SAAS,GAAG;AAClB,MAAM,YAAY,GAAG;AAE5B,MAAM,YAAY,GAAkC,OAAO,OAAoB,EAAE,KAAY,KAAI;AAC7F,IAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;QAChF,KAAK,CAAC,cAAc,EAAE;IAC1B;IAEA,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC;AAEpD,IAAA,MAAM,eAAe,CAAC,IAAI,CAAC;AAC/B,CAAC;AAEM,MAAM,kBAAkB,GAAG,CAAC,OAA6B,KAAmC;AAC/F,IAAA,OAAO,OAAO,EAAe,EAAE,EAAS,KAAI;AACxC,QAAA,MAAM,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC;QAE1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,4BAA4B,CAAC;QACnF,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,EAAE,CAAC;AACnC,IAAA,CAAC;AACL;;;;"}
@@ -0,0 +1,3 @@
1
+ export * from './confirm';
2
+ export * from './copy';
3
+ export * from './processing';
@@ -0,0 +1,4 @@
1
+ export { confirmBehavior, kAttrConfirm, kAttrHref } from './confirm.js';
2
+ export { createCopyBehavior, kAttrCopy, kAttrMessage } from './copy.js';
3
+ export { kProcessingAttribute, kProcessingModeAttribute, processingBehavior } from './processing.js';
4
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,4 @@
1
+ import { DomChangeCallback } from '../dom';
2
+ export declare const kProcessingAttribute = "data-processing";
3
+ export declare const kProcessingModeAttribute = "data-processing-mode";
4
+ export declare const processingBehavior: DomChangeCallback<HTMLElement>;
@@ -0,0 +1,43 @@
1
+ import { readBoolAttribute, readStringAttribute } from '../dom/attributes.js';
2
+ import { createSpinner } from '../ui/spinner.js';
3
+ import { disableElement, enableElement } from '../dom/state.js';
4
+ import { addClass, removeClass } from '../dom/classes.js';
5
+
6
+ const kProcessingAttribute = 'data-processing';
7
+ const kProcessingModeAttribute = 'data-processing-mode';
8
+ const processingBehavior = (element) => {
9
+ const processing = readBoolAttribute(element, kProcessingAttribute);
10
+ const mode = readStringAttribute(element, kProcessingModeAttribute, 'prepend');
11
+ if (processing) {
12
+ if (element.querySelector('[role="status"]')) {
13
+ // Spinner already exist. Nothing action.
14
+ return;
15
+ }
16
+ const spinner = createSpinner('small');
17
+ if (mode === 'prepend') {
18
+ element.prepend(spinner);
19
+ }
20
+ else {
21
+ element.setAttribute('data-html', element.innerHTML);
22
+ element.innerHTML = spinner.outerHTML;
23
+ }
24
+ disableElement(element);
25
+ if (element.tagName.toLowerCase() === 'a') {
26
+ addClass(element, 'disabled');
27
+ }
28
+ }
29
+ else {
30
+ enableElement(element);
31
+ element.querySelector('[role="status"]')?.remove();
32
+ if (element.tagName.toLowerCase() === 'a') {
33
+ removeClass(element, 'disabled');
34
+ }
35
+ if (mode === 'replace') {
36
+ element.innerHTML = readStringAttribute(element, 'data-html');
37
+ element.removeAttribute('data-html');
38
+ }
39
+ }
40
+ };
41
+
42
+ export { kProcessingAttribute, kProcessingModeAttribute, processingBehavior };
43
+ //# sourceMappingURL=processing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processing.js","sources":["../../src/behaviors/processing.ts"],"sourcesContent":["import { addClass, disableElement, DomChangeCallback, enableElement, readBoolAttribute, readStringAttribute, removeClass } from '../dom';\nimport { createSpinner } from '../ui';\n\ntype ProcessingMode = 'prepend' | 'replace';\n\nexport const kProcessingAttribute = 'data-processing';\nexport const kProcessingModeAttribute = 'data-processing-mode';\n\nexport const processingBehavior: DomChangeCallback<HTMLElement> = (element): void => {\n const processing = readBoolAttribute(element, kProcessingAttribute);\n const mode: ProcessingMode = <ProcessingMode>readStringAttribute(element, kProcessingModeAttribute, 'prepend');\n\n if (processing) {\n if (element.querySelector('[role=\"status\"]')) {\n // Spinner already exist. Nothing action.\n return;\n }\n\n const spinner = createSpinner('small');\n\n if (mode === 'prepend') {\n element.prepend(spinner);\n } else {\n element.setAttribute('data-html', element.innerHTML);\n element.innerHTML = spinner.outerHTML;\n }\n\n disableElement(element);\n\n if (element.tagName.toLowerCase() === 'a') {\n addClass(element, 'disabled');\n }\n } else {\n enableElement(element);\n\n (<HTMLSpanElement | null>element.querySelector('[role=\"status\"]'))?.remove();\n\n if (element.tagName.toLowerCase() === 'a') {\n removeClass(element, 'disabled');\n }\n\n if (mode === 'replace') {\n element.innerHTML = readStringAttribute(element, 'data-html');\n element.removeAttribute('data-html');\n }\n }\n};\n"],"names":[],"mappings":";;;;;AAKO,MAAM,oBAAoB,GAAG;AAC7B,MAAM,wBAAwB,GAAG;AAEjC,MAAM,kBAAkB,GAAmC,CAAC,OAAO,KAAU;IAChF,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACnE,MAAM,IAAI,GAAmC,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,EAAE,SAAS,CAAC;IAE9G,IAAI,UAAU,EAAE;AACZ,QAAA,IAAI,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE;;YAE1C;QACJ;AAEA,QAAA,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;AAEtC,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACpB,YAAA,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5B;aAAO;YACH,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC;AACpD,YAAA,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS;QACzC;QAEA,cAAc,CAAC,OAAO,CAAC;QAEvB,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;AACvC,YAAA,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;QACjC;IACJ;SAAO;QACH,aAAa,CAAC,OAAO,CAAC;QAEG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAE,EAAE,MAAM,EAAE;QAE5E,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;AACvC,YAAA,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC;QACpC;AAEA,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,OAAO,CAAC,SAAS,GAAG,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC;AAC7D,YAAA,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC;QACxC;IACJ;AACJ;;;;"}
@@ -0,0 +1 @@
1
+ export declare function copyToClipboard(text: string): Promise<void>;
@@ -0,0 +1,17 @@
1
+ async function copyToClipboard(text) {
2
+ if (navigator.clipboard?.writeText) {
3
+ await navigator.clipboard.writeText(text);
4
+ return;
5
+ }
6
+ const textarea = document.createElement('textarea');
7
+ textarea.value = text;
8
+ textarea.style.position = 'fixed';
9
+ textarea.style.opacity = '0';
10
+ document.body.appendChild(textarea);
11
+ textarea.select();
12
+ document.execCommand('copy');
13
+ document.body.removeChild(textarea);
14
+ }
15
+
16
+ export { copyToClipboard };
17
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sources":["../../src/browser/clipboard.ts"],"sourcesContent":["export async function copyToClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n\n return;\n }\n\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n}\n"],"names":[],"mappings":"AAAO,eAAe,eAAe,CAAC,IAAY,EAAA;AAC9C,IAAA,IAAI,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE;QAChC,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;QAEzC;IACJ;IAEA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AACnD,IAAA,QAAQ,CAAC,KAAK,GAAG,IAAI;AACrB,IAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AACjC,IAAA,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAE5B,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE;AACjB,IAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;AAC5B,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;AACvC;;;;"}
@@ -0,0 +1,4 @@
1
+ export * from './network';
2
+ export * from './clipboard';
3
+ export * from './notifications';
4
+ export * from './request';
@@ -0,0 +1,8 @@
1
+ export { getNetworkConnection } from './network.js';
2
+ export { copyToClipboard } from './clipboard.js';
3
+ export { notifyByResponse, notifyError, notifyFetchError, notifyInfo, notifySuccess, notifyWarning } from './notifications.js';
4
+ export { request } from './request.js';
5
+ export { registerNotificationAdapter } from './notifications/adapter.js';
6
+ export { createToastAdapter } from './notifications/toastr.js';
7
+ export { createNotyfAdapter } from './notifications/notyf.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1 @@
1
+ export declare function navigateTo(url: string): void;
@@ -0,0 +1,6 @@
1
+ function navigateTo(url) {
2
+ window.location.href = url;
3
+ }
4
+
5
+ export { navigateTo };
6
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sources":["../../src/browser/navigation.ts"],"sourcesContent":["export function navigateTo(url: string): void {\n window.location.href = url;\n}\n"],"names":[],"mappings":"AAAM,SAAU,UAAU,CAAC,GAAW,EAAA;AAClC,IAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG;AAC9B;;;;"}
@@ -0,0 +1,7 @@
1
+ export type NetworkConnectionInfo = {
2
+ effectiveType?: 'slow-2g' | '2g' | '3g' | '4g';
3
+ downlink?: number;
4
+ rtt?: number;
5
+ saveData?: boolean;
6
+ };
7
+ export declare function getNetworkConnection(): NetworkConnectionInfo | undefined;
@@ -0,0 +1,8 @@
1
+ function getNetworkConnection() {
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ const nav = navigator;
4
+ return nav.connection || nav.mozConnection || nav.webkitConnection;
5
+ }
6
+
7
+ export { getNetworkConnection };
8
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sources":["../../src/browser/network.ts"],"sourcesContent":["export type NetworkConnectionInfo = {\n effectiveType?: 'slow-2g' | '2g' | '3g' | '4g';\n downlink?: number;\n rtt?: number;\n saveData?: boolean;\n};\n\nexport function getNetworkConnection(): NetworkConnectionInfo | undefined {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nav = navigator as any;\n\n return nav.connection || nav.mozConnection || nav.webkitConnection;\n}\n"],"names":[],"mappings":"SAOgB,oBAAoB,GAAA;;IAEhC,MAAM,GAAG,GAAG,SAAgB;IAE5B,OAAO,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,gBAAgB;AACtE;;;;"}
@@ -0,0 +1,8 @@
1
+ export type NotificationAdapter = {
2
+ success(message: string): Promise<void>;
3
+ error(message: string): Promise<void>;
4
+ info(message: string): Promise<void>;
5
+ warning(message: string): Promise<void>;
6
+ };
7
+ export declare function registerNotificationAdapter(value: NotificationAdapter | null): void;
8
+ export declare function getAdapter(): NotificationAdapter;
@@ -0,0 +1,13 @@
1
+ let adapter = null;
2
+ function registerNotificationAdapter(value) {
3
+ adapter = value;
4
+ }
5
+ function getAdapter() {
6
+ if (!adapter) {
7
+ throw new Error('Notification adapter is not registered. Call registerNotificationAdapter() first.');
8
+ }
9
+ return adapter;
10
+ }
11
+
12
+ export { getAdapter, registerNotificationAdapter };
13
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sources":["../../../src/browser/notifications/adapter.ts"],"sourcesContent":["export type NotificationAdapter = {\n success(message: string): Promise<void>;\n error(message: string): Promise<void>;\n info(message: string): Promise<void>;\n warning(message: string): Promise<void>;\n};\n\nlet adapter: NotificationAdapter | null = null;\n\nexport function registerNotificationAdapter(value: NotificationAdapter | null): void {\n adapter = value;\n}\n\nexport function getAdapter(): NotificationAdapter {\n if (!adapter) {\n throw new Error('Notification adapter is not registered. Call registerNotificationAdapter() first.');\n }\n\n return adapter;\n}\n"],"names":[],"mappings":"AAOA,IAAI,OAAO,GAA+B,IAAI;AAExC,SAAU,2BAA2B,CAAC,KAAiC,EAAA;IACzE,OAAO,GAAG,KAAK;AACnB;SAEgB,UAAU,GAAA;IACtB,IAAI,CAAC,OAAO,EAAE;AACV,QAAA,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC;IACxG;AAEA,IAAA,OAAO,OAAO;AAClB;;;;"}
@@ -0,0 +1,2 @@
1
+ import { NotificationAdapter } from './adapter';
2
+ export declare function createNotyfAdapter(configurator?: (notyf: import('notyf').Notyf) => void): NotificationAdapter;
@@ -0,0 +1,64 @@
1
+ function createNotyfAdapter(configurator) {
2
+ let notyfPromise = null;
3
+ const loadNotyf = async () => {
4
+ if (notyfPromise) {
5
+ return notyfPromise;
6
+ }
7
+ notyfPromise = import('notyf').then((module) => {
8
+ const instance = new module.Notyf({
9
+ types: [
10
+ {
11
+ type: 'warning',
12
+ background: '#f59e0b',
13
+ icon: '<svg viewBox="0 0 24 24"\n' +
14
+ 'width="24"\n' +
15
+ 'height="24"\n' +
16
+ 'fill="currentColor"\n' +
17
+ 'aria-hidden="true">\n' +
18
+ '<path d="M12 2L1 21h22L12 2zm1 16h-2v-2h2v2zm0-4h-2v-4h2v4z"/>\n' +
19
+ '/svg>',
20
+ },
21
+ {
22
+ type: 'info',
23
+ background: '#3b82f6',
24
+ icon: '<svg\n' +
25
+ 'viewBox="0 0 24 24"\n' +
26
+ 'width="24"\n' +
27
+ 'height="24"\n' +
28
+ 'fill="currentColor"\n' +
29
+ 'aria-hidden="true"\n' +
30
+ '>\n' +
31
+ '<path d="M12 2a10 10 0 100 20 10 10 0 000-20zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>\n' +
32
+ '</svg>',
33
+ },
34
+ ],
35
+ });
36
+ configurator?.(instance);
37
+ return instance;
38
+ });
39
+ return notyfPromise;
40
+ };
41
+ return {
42
+ async success(message) {
43
+ (await loadNotyf()).success(message);
44
+ },
45
+ async info(message) {
46
+ (await loadNotyf()).open({
47
+ type: 'info',
48
+ message: message,
49
+ });
50
+ },
51
+ async warning(message) {
52
+ (await loadNotyf()).open({
53
+ type: 'warning',
54
+ message: message,
55
+ });
56
+ },
57
+ async error(message) {
58
+ (await loadNotyf()).error(message);
59
+ },
60
+ };
61
+ }
62
+
63
+ export { createNotyfAdapter };
64
+ //# sourceMappingURL=notyf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notyf.js","sources":["../../../src/browser/notifications/notyf.ts"],"sourcesContent":["import { NotificationAdapter } from './adapter';\n\nexport function createNotyfAdapter(configurator?: (notyf: import('notyf').Notyf) => void): NotificationAdapter {\n let notyfPromise: Promise<import('notyf').Notyf> | null = null;\n\n const loadNotyf = async () => {\n if (notyfPromise) {\n return notyfPromise;\n }\n\n notyfPromise = import('notyf').then((module) => {\n const instance = new module.Notyf({\n types: [\n {\n type: 'warning',\n background: '#f59e0b',\n icon: '<svg viewBox=\"0 0 24 24\"\\n' +\n 'width=\"24\"\\n' +\n 'height=\"24\"\\n' +\n 'fill=\"currentColor\"\\n' +\n 'aria-hidden=\"true\">\\n' +\n '<path d=\"M12 2L1 21h22L12 2zm1 16h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\\n' +\n '/svg>',\n },\n\n {\n type: 'info',\n background: '#3b82f6',\n icon: '<svg\\n' +\n 'viewBox=\"0 0 24 24\"\\n' +\n 'width=\"24\"\\n' +\n 'height=\"24\"\\n' +\n 'fill=\"currentColor\"\\n' +\n 'aria-hidden=\"true\"\\n' +\n '>\\n' +\n '<path d=\"M12 2a10 10 0 100 20 10 10 0 000-20zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/>\\n' +\n '</svg>',\n },\n ],\n });\n\n configurator?.(instance);\n\n return instance;\n });\n\n return notyfPromise;\n };\n\n return {\n async success(message) {\n (await loadNotyf()).success(message);\n },\n async info(message) {\n (await loadNotyf()).open({\n type: 'info',\n message: message,\n });\n },\n async warning(message) {\n (await loadNotyf()).open({\n type: 'warning',\n message: message,\n });\n },\n async error(message) {\n (await loadNotyf()).error(message);\n },\n };\n}"],"names":[],"mappings":"AAEM,SAAU,kBAAkB,CAAC,YAAqD,EAAA;IACpF,IAAI,YAAY,GAA0C,IAAI;AAE9D,IAAA,MAAM,SAAS,GAAG,YAAW;QACzB,IAAI,YAAY,EAAE;AACd,YAAA,OAAO,YAAY;QACvB;QAEA,YAAY,GAAG,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAI;AAC3C,YAAA,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC;AAC9B,gBAAA,KAAK,EAAE;AACH,oBAAA;AACI,wBAAA,IAAI,EAAE,SAAS;AACf,wBAAA,UAAU,EAAE,SAAS;AACrB,wBAAA,IAAI,EAAE,4BAA4B;4BAC9B,cAAc;4BACd,eAAe;4BACf,uBAAuB;4BACvB,uBAAuB;4BACvB,kEAAkE;4BAClE,OAAO;AACd,qBAAA;AAED,oBAAA;AACI,wBAAA,IAAI,EAAE,MAAM;AACZ,wBAAA,UAAU,EAAE,SAAS;AACrB,wBAAA,IAAI,EAAE,QAAQ;4BACV,uBAAuB;4BACvB,cAAc;4BACd,eAAe;4BACf,uBAAuB;4BACvB,sBAAsB;4BACtB,KAAK;4BACL,kFAAkF;4BAClF,QAAQ;AACf,qBAAA;AACJ,iBAAA;AACJ,aAAA,CAAC;AAEF,YAAA,YAAY,GAAG,QAAQ,CAAC;AAExB,YAAA,OAAO,QAAQ;AACnB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,YAAY;AACvB,IAAA,CAAC;IAED,OAAO;QACH,MAAM,OAAO,CAAC,OAAO,EAAA;YACjB,CAAC,MAAM,SAAS,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,EAAA;AACd,YAAA,CAAC,MAAM,SAAS,EAAE,EAAE,IAAI,CAAC;AACrB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,OAAO,EAAE,OAAO;AACnB,aAAA,CAAC;QACN,CAAC;QACD,MAAM,OAAO,CAAC,OAAO,EAAA;AACjB,YAAA,CAAC,MAAM,SAAS,EAAE,EAAE,IAAI,CAAC;AACrB,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,OAAO,EAAE,OAAO;AACnB,aAAA,CAAC;QACN,CAAC;QACD,MAAM,KAAK,CAAC,OAAO,EAAA;YACf,CAAC,MAAM,SAAS,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;QACtC,CAAC;KACJ;AACL;;;;"}
@@ -0,0 +1,4 @@
1
+ import { NotificationAdapter } from './adapter';
2
+ type ToastrModule = typeof import('toastr');
3
+ export declare function createToastAdapter(configurator?: (toastr: ToastrModule) => void): NotificationAdapter;
4
+ export {};
@@ -0,0 +1,30 @@
1
+ function createToastAdapter(configurator) {
2
+ let toastrPromise = null;
3
+ const loadModule = async () => {
4
+ if (toastrPromise) {
5
+ return toastrPromise;
6
+ }
7
+ toastrPromise = import('toastr').then((module) => {
8
+ configurator?.(module);
9
+ return module;
10
+ });
11
+ return toastrPromise;
12
+ };
13
+ return {
14
+ async success(message) {
15
+ (await loadModule()).success(message);
16
+ },
17
+ async info(message) {
18
+ (await loadModule()).info(message);
19
+ },
20
+ async warning(message) {
21
+ (await loadModule()).warning(message);
22
+ },
23
+ async error(message) {
24
+ (await loadModule()).error(message);
25
+ },
26
+ };
27
+ }
28
+
29
+ export { createToastAdapter };
30
+ //# sourceMappingURL=toastr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toastr.js","sources":["../../../src/browser/notifications/toastr.ts"],"sourcesContent":["import { NotificationAdapter } from './adapter';\n\ntype ToastrModule = typeof import('toastr');\n\nexport function createToastAdapter(configurator?: (toastr: ToastrModule) => void): NotificationAdapter {\n let toastrPromise: Promise<ToastrModule> | null = null;\n\n const loadModule = async () => {\n if (toastrPromise) {\n return toastrPromise;\n }\n\n toastrPromise = import('toastr').then((module) => {\n configurator?.(module);\n\n return module;\n });\n\n return toastrPromise;\n };\n\n return {\n async success(message) {\n (await loadModule()).success(message);\n },\n async info(message) {\n (await loadModule()).info(message);\n },\n async warning(message) {\n (await loadModule()).warning(message);\n },\n async error(message) {\n (await loadModule()).error(message);\n },\n };\n}\n"],"names":[],"mappings":"AAIM,SAAU,kBAAkB,CAAC,YAA6C,EAAA;IAC5E,IAAI,aAAa,GAAiC,IAAI;AAEtD,IAAA,MAAM,UAAU,GAAG,YAAW;QAC1B,IAAI,aAAa,EAAE;AACf,YAAA,OAAO,aAAa;QACxB;QAEA,aAAa,GAAG,OAAO,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAI;AAC7C,YAAA,YAAY,GAAG,MAAM,CAAC;AAEtB,YAAA,OAAO,MAAM;AACjB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,aAAa;AACxB,IAAA,CAAC;IAED,OAAO;QACH,MAAM,OAAO,CAAC,OAAO,EAAA;YACjB,CAAC,MAAM,UAAU,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC;QACzC,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,EAAA;YACd,CAAC,MAAM,UAAU,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC;QACtC,CAAC;QACD,MAAM,OAAO,CAAC,OAAO,EAAA;YACjB,CAAC,MAAM,UAAU,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC;QACzC,CAAC;QACD,MAAM,KAAK,CAAC,OAAO,EAAA;YACf,CAAC,MAAM,UAAU,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;QACvC,CAAC;KACJ;AACL;;;;"}
@@ -0,0 +1,10 @@
1
+ export { registerNotificationAdapter } from './notifications/adapter';
2
+ export { createToastAdapter } from './notifications/toastr';
3
+ export { createNotyfAdapter } from './notifications/notyf';
4
+ export declare function notifySuccess(message: string): Promise<void>;
5
+ export declare function notifyError(message: string): Promise<void>;
6
+ export declare function notifyInfo(message: string): Promise<void>;
7
+ export declare function notifyWarning(message: string): Promise<void>;
8
+ export declare function notifyFetchError(): Promise<void>;
9
+ export declare function notifyByResponse(response: Response): Promise<void>;
10
+ export declare function notifyByResponse(response: Response, message: string): Promise<void>;
@@ -0,0 +1,31 @@
1
+ import { getAdapter } from './notifications/adapter.js';
2
+ export { registerNotificationAdapter } from './notifications/adapter.js';
3
+
4
+ async function notifySuccess(message) {
5
+ await getAdapter().success(message);
6
+ }
7
+ async function notifyError(message) {
8
+ await getAdapter().error(message);
9
+ }
10
+ async function notifyInfo(message) {
11
+ await getAdapter().info(message);
12
+ }
13
+ async function notifyWarning(message) {
14
+ await getAdapter().warning(message);
15
+ }
16
+ async function notifyFetchError() {
17
+ await getAdapter().error('Network error: unable to fetch the API request.');
18
+ }
19
+ async function notifyByResponse(response, message) {
20
+ if ([200, 201, 204].includes(response.status)) {
21
+ if (message) {
22
+ await notifySuccess(message);
23
+ }
24
+ }
25
+ else {
26
+ await notifyError(`Receive wrong status - ${response.statusText}`);
27
+ }
28
+ }
29
+
30
+ export { notifyByResponse, notifyError, notifyFetchError, notifyInfo, notifySuccess, notifyWarning };
31
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sources":["../../src/browser/notifications.ts"],"sourcesContent":["import { getAdapter } from './notifications/adapter';\nexport { registerNotificationAdapter } from './notifications/adapter';\nexport { createToastAdapter } from './notifications/toastr';\nexport { createNotyfAdapter } from './notifications/notyf';\n\nexport async function notifySuccess(message: string) {\n await getAdapter().success(message);\n}\n\nexport async function notifyError(message: string) {\n await getAdapter().error(message);\n}\n\nexport async function notifyInfo(message: string) {\n await getAdapter().info(message);\n}\n\nexport async function notifyWarning(message: string) {\n await getAdapter().warning(message);\n}\n\nexport async function notifyFetchError() {\n await getAdapter().error('Network error: unable to fetch the API request.');\n}\n\nexport async function notifyByResponse(response: Response): Promise<void>;\nexport async function notifyByResponse(response: Response, message: string): Promise<void>\n\nexport async function notifyByResponse(response: Response, message?: string) {\n if ([200, 201, 204].includes(response.status)) {\n if (message) {\n await notifySuccess(message);\n }\n } else {\n await notifyError(`Receive wrong status - ${response.statusText}`);\n }\n}\n"],"names":[],"mappings":";;;AAKO,eAAe,aAAa,CAAC,OAAe,EAAA;AAC/C,IAAA,MAAM,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;AACvC;AAEO,eAAe,WAAW,CAAC,OAAe,EAAA;AAC7C,IAAA,MAAM,UAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;AACrC;AAEO,eAAe,UAAU,CAAC,OAAe,EAAA;AAC5C,IAAA,MAAM,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC;AAEO,eAAe,aAAa,CAAC,OAAe,EAAA;AAC/C,IAAA,MAAM,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;AACvC;AAEO,eAAe,gBAAgB,GAAA;AAClC,IAAA,MAAM,UAAU,EAAE,CAAC,KAAK,CAAC,iDAAiD,CAAC;AAC/E;AAKO,eAAe,gBAAgB,CAAC,QAAkB,EAAE,OAAgB,EAAA;AACvE,IAAA,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAC3C,IAAI,OAAO,EAAE;AACT,YAAA,MAAM,aAAa,CAAC,OAAO,CAAC;QAChC;IACJ;SAAO;QACH,MAAM,WAAW,CAAC,CAAA,uBAAA,EAA0B,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;IACtE;AACJ;;;;"}
@@ -0,0 +1,14 @@
1
+ type ProgressInfoEvent = {
2
+ readonly loaded: number;
3
+ readonly total: number;
4
+ readonly progress: number;
5
+ };
6
+ export type UploadProgressCallback = (progress: ProgressInfoEvent) => void;
7
+ export type UploadRequestInit = Omit<RequestInit, 'body'> & {
8
+ readonly body: FormData;
9
+ readonly uploadProgress?: UploadProgressCallback;
10
+ };
11
+ export declare function request(url: string): Promise<Response>;
12
+ export declare function request(url: string, init?: RequestInit): Promise<Response>;
13
+ export declare function request(url: string, init: UploadRequestInit): Promise<Response>;
14
+ export {};
@@ -0,0 +1,78 @@
1
+ function isUploadRequestInit(init) {
2
+ return typeof init === 'object'
3
+ && init !== null
4
+ && 'uploadProgress' in init
5
+ && typeof init.uploadProgress === 'function';
6
+ }
7
+ function xhrRequest(url, init) {
8
+ return new Promise((resolve, reject) => {
9
+ const xhr = new XMLHttpRequest();
10
+ xhr.open(init.method ?? 'POST', url, true);
11
+ // Add headers
12
+ if (init.headers) {
13
+ Object.entries(init.headers).forEach(([name, value]) => xhr.setRequestHeader(name, value));
14
+ }
15
+ // Add pass credentials
16
+ if (init.credentials) {
17
+ xhr.withCredentials = true;
18
+ }
19
+ // Add abort signal
20
+ const signal = init.signal;
21
+ const onAbort = () => {
22
+ xhr.abort();
23
+ reject(new DOMException('Aborted', 'AbortError'));
24
+ };
25
+ if (signal) {
26
+ if (signal.aborted) {
27
+ return onAbort();
28
+ }
29
+ signal.addEventListener('abort', onAbort, {
30
+ once: true,
31
+ });
32
+ }
33
+ xhr.upload.onprogress = (e) => {
34
+ if (!e.lengthComputable) {
35
+ return;
36
+ }
37
+ init.uploadProgress?.({
38
+ loaded: e.loaded,
39
+ total: e.total,
40
+ progress: Math.round((e.loaded / e.total) * 100),
41
+ });
42
+ };
43
+ xhr.onerror = () => {
44
+ reject(new Error('XHR network error'));
45
+ };
46
+ xhr.ontimeout = () => {
47
+ reject(new Error('XHR timeout error'));
48
+ };
49
+ xhr.onload = () => {
50
+ resolve(new Response(xhr.response, {
51
+ status: xhr.status,
52
+ statusText: xhr.statusText,
53
+ headers: parseXhrHeaders(xhr.getAllResponseHeaders()),
54
+ }));
55
+ };
56
+ xhr.responseType = 'arraybuffer';
57
+ xhr.send(init.body);
58
+ });
59
+ }
60
+ function parseXhrHeaders(raw) {
61
+ const headers = new Headers();
62
+ raw.trim().split(/[\r\n]+/).forEach((line) => {
63
+ const idx = line.indexOf(':');
64
+ if (idx > 0) {
65
+ headers.append(line.slice(0, idx).trim(), line.slice(idx + 1).trim());
66
+ }
67
+ });
68
+ return headers;
69
+ }
70
+ function request(url, init) {
71
+ if (init && isUploadRequestInit(init)) {
72
+ return xhrRequest(url, init);
73
+ }
74
+ return fetch(url, init);
75
+ }
76
+
77
+ export { request };
78
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sources":["../../src/browser/request.ts"],"sourcesContent":["type ProgressInfoEvent = {\n readonly loaded: number;\n readonly total: number;\n readonly progress: number;\n}\n\nexport type UploadProgressCallback = (progress: ProgressInfoEvent) => void;\n\nexport type UploadRequestInit = Omit<RequestInit, 'body'> & {\n readonly body: FormData;\n readonly uploadProgress?: UploadProgressCallback;\n}\n\nfunction isUploadRequestInit(init?: RequestInit): init is UploadRequestInit {\n return typeof init === 'object'\n && init !== null\n && 'uploadProgress' in init\n && typeof (init as UploadRequestInit).uploadProgress === 'function';\n}\n\nfunction xhrRequest(url: string, init: UploadRequestInit): Promise<Response> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(init.method ?? 'POST', url, true);\n\n // Add headers\n if (init.headers) {\n Object.entries(init.headers).forEach(([name, value]) => xhr.setRequestHeader(name, value));\n }\n\n // Add pass credentials\n if (init.credentials) {\n xhr.withCredentials = true;\n }\n\n // Add abort signal\n const signal = init.signal;\n const onAbort = () => {\n xhr.abort();\n\n reject(new DOMException('Aborted', 'AbortError'));\n };\n\n if (signal) {\n if (signal.aborted) {\n return onAbort();\n }\n\n signal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n\n xhr.upload.onprogress = (e) => {\n if (!e.lengthComputable) {\n return;\n }\n\n init.uploadProgress?.({\n loaded: e.loaded,\n total: e.total,\n progress: Math.round((e.loaded / e.total) * 100),\n });\n };\n\n xhr.onerror = () => {\n reject(new Error('XHR network error'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('XHR timeout error'));\n };\n\n xhr.onload = () => {\n resolve(new Response(xhr.response, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseXhrHeaders(xhr.getAllResponseHeaders()),\n }));\n };\n\n xhr.responseType = 'arraybuffer';\n xhr.send(init.body);\n });\n}\n\nfunction parseXhrHeaders(raw: string): Headers {\n const headers = new Headers();\n\n raw.trim().split(/[\\r\\n]+/).forEach((line) => {\n const idx = line.indexOf(':');\n\n if (idx > 0) {\n headers.append(line.slice(0, idx).trim(), line.slice(idx + 1).trim());\n }\n });\n\n return headers;\n}\n\nexport function request(url: string): Promise<Response>;\nexport function request(url: string, init?: RequestInit): Promise<Response>;\nexport function request(url: string, init: UploadRequestInit): Promise<Response>;\n\nexport function request(url: string, init?: unknown): Promise<Response> {\n if (init && isUploadRequestInit(init)) {\n return xhrRequest(url, init);\n }\n\n return fetch(url, init as RequestInit | undefined);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function readBoolAttribute(element: HTMLElement, attribute: string, defaultValue: boolean): boolean;
2
+ export declare function readBoolAttribute(element: HTMLElement, attribute: string): boolean | undefined;
3
+ export declare function readStringAttribute(element: HTMLElement, attribute: string): string;
4
+ export declare function readStringAttribute(element: HTMLElement, attribute: string, defaultValue?: string): string;
@@ -0,0 +1,16 @@
1
+ function readBoolAttribute(element, attribute, defaultValue) {
2
+ if (!element.hasAttribute(attribute)) {
3
+ return defaultValue;
4
+ }
5
+ const value = element.getAttribute(attribute);
6
+ return !(value === '0' || value === 'no' || value === 'false');
7
+ }
8
+ function readStringAttribute(element, attribute, defaultValue) {
9
+ if (!element.hasAttribute(attribute)) {
10
+ return typeof defaultValue === 'string' ? defaultValue : '';
11
+ }
12
+ return String(element.getAttribute(attribute));
13
+ }
14
+
15
+ export { readBoolAttribute, readStringAttribute };
16
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.js","sources":["../../src/dom/attributes.ts"],"sourcesContent":["export function readBoolAttribute(element: HTMLElement, attribute: string, defaultValue: boolean): boolean;\nexport function readBoolAttribute(element: HTMLElement, attribute: string): boolean | undefined;\n\nexport function readBoolAttribute(element: HTMLElement, attribute: string, defaultValue?: boolean): boolean | undefined {\n if (!element.hasAttribute(attribute)) {\n return defaultValue;\n }\n\n const value = element.getAttribute(attribute);\n\n return !(value === '0' || value === 'no' || value === 'false');\n}\n\nexport function readStringAttribute(element: HTMLElement, attribute: string): string;\nexport function readStringAttribute(element: HTMLElement, attribute: string, defaultValue?: string): string;\n\nexport function readStringAttribute(element: HTMLElement, attribute: string, defaultValue?: string): string {\n if (!element.hasAttribute(attribute)) {\n return typeof defaultValue === 'string' ? defaultValue : '';\n }\n\n return String(element.getAttribute(attribute));\n}\n"],"names":[],"mappings":"SAGgB,iBAAiB,CAAC,OAAoB,EAAE,SAAiB,EAAE,YAAsB,EAAA;IAC7F,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;AAClC,QAAA,OAAO,YAAY;IACvB;IAEA,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC;AAE7C,IAAA,OAAO,EAAE,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO,CAAC;AAClE;SAKgB,mBAAmB,CAAC,OAAoB,EAAE,SAAiB,EAAE,YAAqB,EAAA;IAC9F,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;AAClC,QAAA,OAAO,OAAO,YAAY,KAAK,QAAQ,GAAG,YAAY,GAAG,EAAE;IAC/D;IAEA,OAAO,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAClD;;;;"}
@@ -10,8 +10,8 @@ type SelectorsDomChangeOptions = BaseDomChangeOptions & {
10
10
  readonly selectors?: DomChangeCallbacks;
11
11
  selector?: never;
12
12
  };
13
- export type DomChangeCallback = (target: Element, item?: MutationRecord) => void;
14
- export type DomChangeCallbacks = Record<string, DomChangeCallback>;
13
+ export type DomChangeCallback<T extends Element = Element> = (target: T, item?: MutationRecord) => void;
14
+ export type DomChangeCallbacks<T extends Element = Element> = Record<string, DomChangeCallback<T>>;
15
15
  export declare function onDomChanges(options: SelectorDomChangeOptions, callback: DomChangeCallback): void;
16
16
  export declare function onDomChanges(options: SelectorsDomChangeOptions): void;
17
17
  export {};
@@ -1,4 +1,4 @@
1
- import { onDomReady } from './dom-ready.js';
1
+ import { onDomReady } from './ready.js';
2
2
 
3
3
  function onDomChanges(options, callback) {
4
4
  if (options.selector && options.selectors) {
@@ -76,4 +76,4 @@ function onDomChanges(options, callback) {
76
76
  }
77
77
 
78
78
  export { onDomChanges };
79
- //# sourceMappingURL=dom-changes.js.map
79
+ //# sourceMappingURL=changes.js.map