@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.
- package/README.md +9 -1
- package/dist/behaviors/confirm.d.ts +4 -0
- package/dist/behaviors/confirm.js +18 -0
- package/dist/behaviors/confirm.js.map +1 -0
- package/dist/behaviors/copy.d.ts +7 -0
- package/dist/behaviors/copy.js +22 -0
- package/dist/behaviors/copy.js.map +1 -0
- package/dist/behaviors/index.d.ts +3 -0
- package/dist/behaviors/index.js +4 -0
- package/dist/{index.js.map → behaviors/index.js.map} +1 -1
- package/dist/behaviors/processing.d.ts +4 -0
- package/dist/behaviors/processing.js +43 -0
- package/dist/behaviors/processing.js.map +1 -0
- package/dist/browser/clipboard.d.ts +1 -0
- package/dist/browser/clipboard.js +17 -0
- package/dist/browser/clipboard.js.map +1 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.js +8 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/navigation.d.ts +1 -0
- package/dist/browser/navigation.js +6 -0
- package/dist/browser/navigation.js.map +1 -0
- package/dist/browser/network.d.ts +7 -0
- package/dist/browser/network.js +8 -0
- package/dist/browser/network.js.map +1 -0
- package/dist/browser/notifications/adapter.d.ts +8 -0
- package/dist/browser/notifications/adapter.js +13 -0
- package/dist/browser/notifications/adapter.js.map +1 -0
- package/dist/browser/notifications/notyf.d.ts +2 -0
- package/dist/browser/notifications/notyf.js +64 -0
- package/dist/browser/notifications/notyf.js.map +1 -0
- package/dist/browser/notifications/toastr.d.ts +4 -0
- package/dist/browser/notifications/toastr.js +30 -0
- package/dist/browser/notifications/toastr.js.map +1 -0
- package/dist/browser/notifications.d.ts +10 -0
- package/dist/browser/notifications.js +31 -0
- package/dist/browser/notifications.js.map +1 -0
- package/dist/browser/request.d.ts +14 -0
- package/dist/browser/request.js +78 -0
- package/dist/browser/request.js.map +1 -0
- package/dist/dom/attributes.d.ts +4 -0
- package/dist/dom/attributes.js +16 -0
- package/dist/dom/attributes.js.map +1 -0
- package/dist/dom/{dom-changes.d.ts → changes.d.ts} +2 -2
- package/dist/dom/{dom-changes.js → changes.js} +2 -2
- package/dist/dom/changes.js.map +1 -0
- package/dist/dom/classes.d.ts +2 -0
- package/dist/dom/classes.js +9 -0
- package/dist/dom/classes.js.map +1 -0
- package/dist/dom/embedded-data.d.ts +5 -0
- package/dist/dom/embedded-data.js +21 -0
- package/dist/dom/embedded-data.js.map +1 -0
- package/dist/dom/events.d.ts +18 -0
- package/dist/dom/{dom-events.js → events.js} +2 -2
- package/dist/dom/events.js.map +1 -0
- package/dist/dom/index.d.ts +7 -0
- package/dist/dom/index.js +8 -0
- package/dist/dom/index.js.map +1 -0
- package/dist/dom/{dom-ready.js → ready.js} +1 -1
- package/dist/dom/ready.js.map +1 -0
- package/dist/dom/state.d.ts +3 -0
- package/dist/dom/state.js +14 -0
- package/dist/dom/state.js.map +1 -0
- package/dist/dom/visibility.d.ts +2 -0
- package/dist/dom/visibility.js +18 -0
- package/dist/dom/visibility.js.map +1 -0
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/index.js +3 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/sentry/integrations.d.ts +2 -0
- package/dist/observability/sentry/integrations.js +25 -0
- package/dist/observability/sentry/integrations.js.map +1 -0
- package/dist/observability/sentry/sentry.d.ts +14 -0
- package/dist/observability/sentry/sentry.js +93 -0
- package/dist/observability/sentry/sentry.js.map +1 -0
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.js +2 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/spinner.d.ts +1 -0
- package/dist/ui/spinner.js +14 -0
- package/dist/ui/spinner.js.map +1 -0
- package/package.json +57 -4
- package/dist/dom/dom-changes.js.map +0 -1
- package/dist/dom/dom-events.d.ts +0 -18
- package/dist/dom/dom-events.js.map +0 -1
- package/dist/dom/dom-ready.js.map +0 -1
- package/dist/dom/dom-visibility.d.ts +0 -2
- package/dist/dom/dom-visibility.js +0 -9
- package/dist/dom/dom-visibility.js.map +0 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -5
- /package/dist/dom/{dom-ready.d.ts → ready.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changes.js","sources":["../../src/dom/changes.ts"],"sourcesContent":["import { onDomReady } from './ready';\n\ntype BaseDomChangeOptions = MutationObserverInit & {\n readonly onDomReady?: boolean; // execute handler after dom ready?\n readonly target?: string; // where we must see changes?\n}\n\ntype SelectorDomChangeOptions = BaseDomChangeOptions & {\n readonly selector?: string; // what element we find?\n selectors?: never;\n}\n\ntype SelectorsDomChangeOptions = BaseDomChangeOptions & {\n readonly selectors?: DomChangeCallbacks; // each selector must contain callback function\n selector?: never;\n}\n\ntype DomChangeOptions = SelectorsDomChangeOptions | SelectorDomChangeOptions;\n\nexport type DomChangeCallback<T extends Element = Element> = (target: T, item?: MutationRecord) => void;\nexport type DomChangeCallbacks<T extends Element = Element> = Record<string, DomChangeCallback<T>>;\n\nexport function onDomChanges(options: SelectorDomChangeOptions, callback: DomChangeCallback): void;\nexport function onDomChanges(options: SelectorsDomChangeOptions): void;\n\nexport function onDomChanges(options: DomChangeOptions, callback?: DomChangeCallback): void {\n if (options.selector && options.selectors) {\n throw new Error('Only one option must be provided: either selector or selectors, not both.');\n }\n\n if (options.selectors && callback) {\n throw new Error('Only one option must be provided: either selectors or callback, not both.');\n }\n\n function changesOnElementWithSelector(element: HTMLElement, handler: DomChangeCallback, item?: MutationRecord, selector?: string): void {\n if (selector) {\n if (element.matches(selector)) {\n handler.call(null, element, item);\n } else {\n element.querySelectorAll(selector).forEach((innerElement) => {\n handler.call(null, innerElement, item);\n });\n }\n } else {\n handler.call(null, element, item);\n }\n }\n\n function changesOnElementWithSelectors(element: HTMLElement, selectors: DomChangeCallbacks, item?: MutationRecord): void {\n Object.entries(selectors).forEach(([selector, handler]) => {\n changesOnElementWithSelector.call(null, element, handler, item, selector);\n });\n }\n\n let selectors: DomChangeCallbacks | undefined = undefined;\n\n if (options.selectors) {\n selectors = options.selectors;\n } else if (options.selector) {\n if (!callback) {\n throw new Error('Missed callback.');\n }\n\n selectors = {};\n selectors[options.selector] = callback;\n }\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((item) => {\n item.addedNodes.forEach((node) => {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n if (selectors) {\n changesOnElementWithSelectors(node, selectors, item);\n } else {\n if (!callback) {\n throw new Error('Missed callback.');\n }\n\n changesOnElementWithSelector(node, callback, item);\n }\n });\n\n if (item.attributeName) {\n callback?.call(null, <Element>item.target, item);\n }\n });\n });\n\n onDomReady(() => {\n const target = <HTMLElement>(options.target ? document.querySelector(options.target) : document.body);\n\n if (!target) {\n console.debug(`The target with selector \"${options.target}\" for listen page changes was not found.`);\n\n return;\n }\n\n observer.observe(target, options);\n\n if (options.onDomReady) {\n if (!selectors) {\n throw new Error('Selector or selectors is required for enable \"on dom ready\".');\n }\n\n changesOnElementWithSelectors(target, selectors);\n }\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classes.js","sources":["../../src/dom/classes.ts"],"sourcesContent":["export function addClass(element: HTMLElement, ...classes: string[]): void {\n element.classList.add(...classes);\n}\n\nexport function removeClass(element: HTMLElement, ...classes: string[]): void {\n element.classList.remove(...classes);\n}\n"],"names":[],"mappings":"SAAgB,QAAQ,CAAC,OAAoB,EAAE,GAAG,OAAiB,EAAA;IAC/D,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;AACrC;SAEgB,WAAW,CAAC,OAAoB,EAAE,GAAG,OAAiB,EAAA;IAClE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;AACxC;;;;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function existsEmbeddedData(id: string): boolean;
|
|
2
|
+
type EmbeddedData = Record<string, unknown>;
|
|
3
|
+
export declare function readEmbeddedData<T extends EmbeddedData = EmbeddedData>(id: string): T;
|
|
4
|
+
export declare function readEmbeddedData<T extends EmbeddedData = EmbeddedData>(script: HTMLScriptElement): T;
|
|
5
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function findEmbeddedScript(id) {
|
|
2
|
+
return document.querySelector(`script[type="application/json"][id="${id}"]`) ||
|
|
3
|
+
document.querySelector(`script[type="application/json"][data-${id}]`);
|
|
4
|
+
}
|
|
5
|
+
function existsEmbeddedData(id) {
|
|
6
|
+
return Boolean(findEmbeddedScript(id));
|
|
7
|
+
}
|
|
8
|
+
function readEmbeddedData(script) {
|
|
9
|
+
let embeddedData = null;
|
|
10
|
+
{
|
|
11
|
+
const scriptEl = findEmbeddedScript(script);
|
|
12
|
+
if (!scriptEl) {
|
|
13
|
+
throw new Error(`Can't find script[type="application/json"] with id "${script}".`);
|
|
14
|
+
}
|
|
15
|
+
embeddedData = scriptEl.textContent;
|
|
16
|
+
}
|
|
17
|
+
return embeddedData.length ? JSON.parse(embeddedData) : null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { existsEmbeddedData, readEmbeddedData };
|
|
21
|
+
//# sourceMappingURL=embedded-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-data.js","sources":["../../src/dom/embedded-data.ts"],"sourcesContent":["function findEmbeddedScript(id: string): HTMLScriptElement | null {\n return document.querySelector(`script[type=\"application/json\"][id=\"${id}\"]`) ||\n document.querySelector(`script[type=\"application/json\"][data-${id}]`);\n}\n\nexport function existsEmbeddedData(id: string): boolean {\n return Boolean(findEmbeddedScript(id));\n}\n\ntype EmbeddedData = Record<string, unknown>\n\nexport function readEmbeddedData<T extends EmbeddedData = EmbeddedData>(id: string): T;\nexport function readEmbeddedData<T extends EmbeddedData = EmbeddedData>(script: HTMLScriptElement): T;\n\nexport function readEmbeddedData<T extends EmbeddedData = EmbeddedData>(script: unknown): T | null {\n let embeddedData: string | null = null;\n\n if (typeof script === 'string') {\n const scriptEl = findEmbeddedScript(script);\n\n if (!scriptEl) {\n throw new Error(`Can't find script[type=\"application/json\"] with id \"${script}\".`);\n }\n\n embeddedData = scriptEl.textContent;\n } else if (script instanceof Element) {\n if (script.nodeName.toLowerCase() !== 'script') {\n throw new Error(`Can't read embedded data from \"${script.nodeName}\" node.`);\n }\n\n embeddedData = script.textContent;\n } else {\n throw new TypeError('Unknown input script.');\n }\n\n return embeddedData.length ? JSON.parse(embeddedData) : null;\n}\n"],"names":[],"mappings":"AAAA,SAAS,kBAAkB,CAAC,EAAU,EAAA;AAClC,IAAA,OAAO,QAAQ,CAAC,aAAa,CAAC,CAAA,oCAAA,EAAuC,EAAE,IAAI,CAAC;AACxE,QAAA,QAAQ,CAAC,aAAa,CAAC,wCAAwC,EAAE,CAAA,CAAA,CAAG,CAAC;AAC7E;AAEM,SAAU,kBAAkB,CAAC,EAAU,EAAA;AACzC,IAAA,OAAO,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAC1C;AAOM,SAAU,gBAAgB,CAAwC,MAAe,EAAA;IACnF,IAAI,YAAY,GAAkB,IAAI;AAEtC,IAAgC;AAC5B,QAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC;QAE3C,IAAI,CAAC,QAAQ,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAA,EAAA,CAAI,CAAC;QACtF;AAEA,QAAA,YAAY,GAAG,QAAQ,CAAC,WAAW;IACvC;AAUA,IAAA,OAAO,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI;AAChE;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type DomEventCallback<E extends Element = Element> = (element: E, event: Event) => void | Promise<void>;
|
|
2
|
+
export type DomEventCallbacks<E extends Element = Element> = Record<string, DomEventCallback<E>>;
|
|
3
|
+
type EventName = 'click' | 'change';
|
|
4
|
+
type Selector = string;
|
|
5
|
+
type BaseListenOptions = {
|
|
6
|
+
readonly target?: string | HTMLElement;
|
|
7
|
+
};
|
|
8
|
+
type SelectorListenOptions = BaseListenOptions & {
|
|
9
|
+
readonly selector: Selector;
|
|
10
|
+
selectors?: never;
|
|
11
|
+
};
|
|
12
|
+
type SelectorsListenOptions<E extends Element = Element> = BaseListenOptions & {
|
|
13
|
+
readonly selectors: DomEventCallbacks<E>;
|
|
14
|
+
selector?: never;
|
|
15
|
+
};
|
|
16
|
+
export declare function onDomEvents<E extends Element = Element>(eventName: EventName, options: SelectorListenOptions | string, handler: DomEventCallback<E>): void;
|
|
17
|
+
export declare function onDomEvents<E extends Element = Element>(eventName: EventName, options: SelectorsListenOptions<E>): void;
|
|
18
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { onDomReady } from './
|
|
1
|
+
import { onDomReady } from './ready.js';
|
|
2
2
|
|
|
3
3
|
function onDomEvents(eventName, options, handler) {
|
|
4
4
|
if (typeof options === 'string') {
|
|
@@ -51,4 +51,4 @@ function onDomEvents(eventName, options, handler) {
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export { onDomEvents };
|
|
54
|
-
//# sourceMappingURL=
|
|
54
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sources":["../../src/dom/events.ts"],"sourcesContent":["import { onDomReady } from './ready';\n\nexport type DomEventCallback<E extends Element = Element> = (element: E, event: Event) => void | Promise<void>;\nexport type DomEventCallbacks<E extends Element = Element> = Record<string, DomEventCallback<E>>;\n\ntype EventName = 'click' | 'change';\ntype Selector = string;\n\ntype BaseListenOptions = {\n readonly target?: string | HTMLElement;\n}\n\ntype SelectorListenOptions = BaseListenOptions & {\n readonly selector: Selector;\n selectors?: never;\n}\n\ntype SelectorsListenOptions<E extends Element = Element> = BaseListenOptions & {\n readonly selectors: DomEventCallbacks<E>;\n selector?: never;\n}\n\nexport function onDomEvents<E extends Element = Element>(eventName: EventName, options: SelectorListenOptions | string, handler: DomEventCallback<E>): void;\nexport function onDomEvents<E extends Element = Element>(eventName: EventName, options: SelectorsListenOptions<E>): void;\n\nexport function onDomEvents<E extends Element = Element>(eventName: EventName, options: SelectorListenOptions | SelectorsListenOptions<E> | string, handler?: DomEventCallback<E>): void {\n if (typeof options === 'string') {\n options = <SelectorListenOptions>{\n selector: options,\n };\n }\n\n if (options.selectors && handler) {\n throw new Error('Only one option must be provided: either selectors or callback, not both.');\n }\n\n let selectors: DomEventCallbacks;\n\n if (options.selectors) {\n selectors = options.selectors as DomEventCallbacks;\n } else {\n if (!handler) {\n throw new Error('Missed handler');\n }\n\n selectors = {};\n selectors[options.selector] = handler as DomEventCallback;\n }\n\n const findHandler = (selectors: DomEventCallbacks, element: HTMLElement): [HTMLElement, DomEventCallback] | null => {\n for (const [selector, handler] of Object.entries(selectors)) {\n if (element.matches(selector)) {\n return [element, handler];\n }\n\n const parent = <HTMLElement>element.closest(selector);\n\n if (parent) {\n return [parent, handler];\n }\n }\n\n return null;\n };\n\n onDomReady(() => {\n let target: Element | null = document.body;\n\n if (options.target) {\n target = options.target instanceof Element ? options.target : document.querySelector(options.target);\n\n if (!target) {\n throw new Error(`Missed target element by selector \"${options.target}\".`);\n }\n }\n\n target.addEventListener(eventName, (event): void => {\n const target = <HTMLElement>event.target;\n const entry = findHandler(selectors, target);\n\n if (entry) {\n entry[1].call(null, entry[0], event);\n }\n });\n });\n}\n"],"names":[],"mappings":";;SAyBgB,WAAW,CAA8B,SAAoB,EAAE,OAAmE,EAAE,OAA6B,EAAA;AAC7K,IAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,GAA0B;AAC7B,YAAA,QAAQ,EAAE,OAAO;SACpB;IACL;AAEA,IAAA,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,EAAE;AAC9B,QAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;IAChG;AAEA,IAAA,IAAI,SAA4B;AAEhC,IAAA,IAAI,OAAO,CAAC,SAAS,EAAE;AACnB,QAAA,SAAS,GAAG,OAAO,CAAC,SAA8B;IACtD;SAAO;QACH,IAAI,CAAC,OAAO,EAAE;AACV,YAAA,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC;QACrC;QAEA,SAAS,GAAG,EAAE;AACd,QAAA,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAA2B;IAC7D;AAEA,IAAA,MAAM,WAAW,GAAG,CAAC,SAA4B,EAAE,OAAoB,KAA4C;AAC/G,QAAA,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AACzD,YAAA,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3B,gBAAA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;YAC7B;YAEA,MAAM,MAAM,GAAgB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAErD,IAAI,MAAM,EAAE;AACR,gBAAA,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YAC5B;QACJ;AAEA,QAAA,OAAO,IAAI;AACf,IAAA,CAAC;IAED,UAAU,CAAC,MAAK;AACZ,QAAA,IAAI,MAAM,GAAmB,QAAQ,CAAC,IAAI;AAE1C,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;YAChB,MAAM,GAAG,OAAO,CAAC,MAAM,YAAY,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YAEpG,IAAI,CAAC,MAAM,EAAE;gBACT,MAAM,IAAI,KAAK,CAAC,CAAA,mCAAA,EAAsC,OAAO,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;YAC7E;QACJ;QAEA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,KAAU;AAC/C,YAAA,MAAM,MAAM,GAAgB,KAAK,CAAC,MAAM;YACxC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC;YAE5C,IAAI,KAAK,EAAE;AACP,gBAAA,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;YACxC;AACJ,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,CAAC;AACN;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { readBoolAttribute, readStringAttribute } from './attributes.js';
|
|
2
|
+
export { onDomChanges } from './changes.js';
|
|
3
|
+
export { addClass, removeClass } from './classes.js';
|
|
4
|
+
export { onDomEvents } from './events.js';
|
|
5
|
+
export { onDomReady } from './ready.js';
|
|
6
|
+
export { disableElement, enableElement, isDisabled } from './state.js';
|
|
7
|
+
export { hideElement, showElement } from './visibility.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ready.js","sources":["../../src/dom/ready.ts"],"sourcesContent":["export type DomReadyCallback = () => void;\n\nexport function onDomReady(callback: DomReadyCallback): void;\nexport function onDomReady(callback: Array<DomReadyCallback>): void\n\nexport function onDomReady(callback: DomReadyCallback | Array<DomReadyCallback>): void {\n let wrap: DomReadyCallback;\n\n if (Array.isArray(callback)) {\n wrap = () => callback.forEach((c) => c.call(null));\n } else {\n wrap = callback;\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', wrap, {\n once: true,\n });\n } else {\n wrap.call(null);\n }\n}\n"],"names":[],"mappings":"AAKM,SAAU,UAAU,CAAC,QAAoD,EAAA;AAC3E,IAAA,IAAI,IAAsB;AAE1B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QACzB,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD;SAAO;QACH,IAAI,GAAG,QAAQ;IACnB;AAEA,IAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;AACnC,QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,EAAE;AAChD,YAAA,IAAI,EAAE,IAAI;AACb,SAAA,CAAC;IACN;SAAO;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACnB;AACJ;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { readBoolAttribute } from './attributes.js';
|
|
2
|
+
|
|
3
|
+
function isDisabled(element) {
|
|
4
|
+
return readBoolAttribute(element, 'disabled', false);
|
|
5
|
+
}
|
|
6
|
+
function disableElement(element) {
|
|
7
|
+
element.setAttribute('disabled', 'disabled');
|
|
8
|
+
}
|
|
9
|
+
function enableElement(element) {
|
|
10
|
+
element.removeAttribute('disabled');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { disableElement, enableElement, isDisabled };
|
|
14
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sources":["../../src/dom/state.ts"],"sourcesContent":["import { readBoolAttribute } from './attributes';\n\nexport function isDisabled(element: HTMLElement): boolean {\n return readBoolAttribute(element, 'disabled', false);\n}\n\nexport function disableElement(element: HTMLElement): void {\n element.setAttribute('disabled', 'disabled');\n}\n\nexport function enableElement(element: HTMLElement): void {\n element.removeAttribute('disabled');\n}\n"],"names":[],"mappings":";;AAEM,SAAU,UAAU,CAAC,OAAoB,EAAA;IAC3C,OAAO,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC;AACxD;AAEM,SAAU,cAAc,CAAC,OAAoB,EAAA;AAC/C,IAAA,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;AAChD;AAEM,SAAU,aAAa,CAAC,OAAoB,EAAA;AAC9C,IAAA,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC;AACvC;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { removeClass, addClass } from './classes.js';
|
|
2
|
+
|
|
3
|
+
function showElement(...elements) {
|
|
4
|
+
elements.forEach((element) => {
|
|
5
|
+
removeClass(element, 'd-none');
|
|
6
|
+
if (element.style.display === 'none') {
|
|
7
|
+
element.style.display = '';
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function hideElement(...elements) {
|
|
12
|
+
elements.forEach((element) => {
|
|
13
|
+
addClass(element, 'd-none');
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { hideElement, showElement };
|
|
18
|
+
//# sourceMappingURL=visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visibility.js","sources":["../../src/dom/visibility.ts"],"sourcesContent":["import { addClass, removeClass } from './classes';\n\nexport function showElement(...elements: Array<HTMLElement>): void {\n elements.forEach((element) => {\n removeClass(element, 'd-none');\n\n if (element.style.display === 'none') {\n element.style.display = '';\n }\n });\n}\n\nexport function hideElement(...elements: Array<HTMLElement>): void {\n elements.forEach((element) => {\n addClass(element, 'd-none');\n });\n}\n"],"names":[],"mappings":";;AAEM,SAAU,WAAW,CAAC,GAAG,QAA4B,EAAA;AACvD,IAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACzB,QAAA,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC;QAE9B,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE;AAClC,YAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE;QAC9B;AACJ,IAAA,CAAC,CAAC;AACN;AAEM,SAAU,WAAW,CAAC,GAAG,QAA4B,EAAA;AACvD,IAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACzB,QAAA,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;AAC/B,IAAA,CAAC,CAAC;AACN;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sentry/sentry';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { getNetworkConnection } from '../../browser/network.js';
|
|
2
|
+
|
|
3
|
+
const networkInfoIntegration = {
|
|
4
|
+
name: 'NetworkInfo',
|
|
5
|
+
processEvent: (event) => {
|
|
6
|
+
const network = getNetworkConnection();
|
|
7
|
+
if (network) {
|
|
8
|
+
event.contexts ??= {};
|
|
9
|
+
event.contexts['Network'] = {
|
|
10
|
+
'Effective type': network.effectiveType,
|
|
11
|
+
Downlink: network.downlink,
|
|
12
|
+
RTT: network.rtt,
|
|
13
|
+
'Save data': network.saveData,
|
|
14
|
+
};
|
|
15
|
+
event.tags = {
|
|
16
|
+
...event.tags,
|
|
17
|
+
network: network.effectiveType,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return event;
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { networkInfoIntegration };
|
|
25
|
+
//# sourceMappingURL=integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.js","sources":["../../../src/observability/sentry/integrations.ts"],"sourcesContent":["import type { Integration } from '@sentry/core';\nimport { getNetworkConnection } from '../../browser';\n\nexport const networkInfoIntegration: Integration = {\n name: 'NetworkInfo',\n processEvent: (event) => {\n const network = getNetworkConnection();\n\n if (network) {\n event.contexts ??= {};\n\n event.contexts['Network'] = {\n 'Effective type': network.effectiveType,\n Downlink: network.downlink,\n RTT: network.rtt,\n 'Save data': network.saveData,\n };\n\n event.tags = {\n ...event.tags,\n network: network.effectiveType,\n };\n }\n\n return event;\n },\n};\n"],"names":[],"mappings":";;AAGO,MAAM,sBAAsB,GAAgB;AAC/C,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,YAAY,EAAE,CAAC,KAAK,KAAI;AACpB,QAAA,MAAM,OAAO,GAAG,oBAAoB,EAAE;QAEtC,IAAI,OAAO,EAAE;AACT,YAAA,KAAK,CAAC,QAAQ,KAAK,EAAE;AAErB,YAAA,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG;gBACxB,gBAAgB,EAAE,OAAO,CAAC,aAAa;gBACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,WAAW,EAAE,OAAO,CAAC,QAAQ;aAChC;YAED,KAAK,CAAC,IAAI,GAAG;gBACT,GAAG,KAAK,CAAC,IAAI;gBACb,OAAO,EAAE,OAAO,CAAC,aAAa;aACjC;QACL;AAEA,QAAA,OAAO,KAAK;IAChB,CAAC;;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BrowserOptions } from '@sentry/browser';
|
|
2
|
+
export * from './integrations';
|
|
3
|
+
type SentryOptions = BrowserOptions & {
|
|
4
|
+
tags?: Record<string, string>;
|
|
5
|
+
};
|
|
6
|
+
export declare function configureSentry<K extends keyof SentryOptions>(key: K, value: SentryOptions[K], overwrite?: boolean): void;
|
|
7
|
+
export declare function loadSentry(): Promise<typeof import("@sentry/browser")>;
|
|
8
|
+
export declare function listenGlobalErrors(): void;
|
|
9
|
+
export declare function handleError(error: unknown): Promise<void>;
|
|
10
|
+
export declare function registerDebugHandler(): void;
|
|
11
|
+
export declare const __test__: {
|
|
12
|
+
getOptions: () => SentryOptions;
|
|
13
|
+
reset: () => void;
|
|
14
|
+
} | undefined;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { existsEmbeddedData, readEmbeddedData } from '../../dom/embedded-data.js';
|
|
2
|
+
|
|
3
|
+
let loadSentryPromise = null;
|
|
4
|
+
let sentryInitOptions = {};
|
|
5
|
+
function configureSentry(key, value, overwrite = true) {
|
|
6
|
+
if (key in sentryInitOptions) {
|
|
7
|
+
if (!overwrite) {
|
|
8
|
+
// Disable overwrite. Ignore.
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const activeValue = sentryInitOptions[key];
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
value = [
|
|
14
|
+
...(Array.isArray(activeValue) ? activeValue : []),
|
|
15
|
+
...value,
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
else if (typeof value === 'object') {
|
|
19
|
+
value = {
|
|
20
|
+
...(typeof activeValue === 'object' ? activeValue : {}),
|
|
21
|
+
...value,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
sentryInitOptions[key] = value;
|
|
26
|
+
}
|
|
27
|
+
async function loadSentry() {
|
|
28
|
+
if (loadSentryPromise) {
|
|
29
|
+
return loadSentryPromise;
|
|
30
|
+
}
|
|
31
|
+
if (existsEmbeddedData('sentry')) {
|
|
32
|
+
const config = readEmbeddedData('sentry');
|
|
33
|
+
configureSentry('dsn', config.dsn || '', false);
|
|
34
|
+
configureSentry('environment', config.environment || '', false);
|
|
35
|
+
configureSentry('release', config.release || '', false);
|
|
36
|
+
configureSentry('tags', typeof config.tags === 'object' && null !== config.tags ? config.tags : {});
|
|
37
|
+
}
|
|
38
|
+
loadSentryPromise = import('@sentry/browser').then((module) => {
|
|
39
|
+
module.init({
|
|
40
|
+
...sentryInitOptions,
|
|
41
|
+
initialScope: (scope) => {
|
|
42
|
+
if (sentryInitOptions.tags) {
|
|
43
|
+
scope.setTags(sentryInitOptions.tags);
|
|
44
|
+
}
|
|
45
|
+
return scope;
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
return module;
|
|
49
|
+
});
|
|
50
|
+
return loadSentryPromise;
|
|
51
|
+
}
|
|
52
|
+
function listenGlobalErrors() {
|
|
53
|
+
window.addEventListener('error', async (event) => {
|
|
54
|
+
const error = event.error ?? new Error(event.message ?? 'Unknown error');
|
|
55
|
+
await handleError(error);
|
|
56
|
+
});
|
|
57
|
+
window.addEventListener('unhandledrejection', async (event) => {
|
|
58
|
+
const reason = event.reason instanceof Error
|
|
59
|
+
? event.reason
|
|
60
|
+
: new Error(typeof event.reason === 'string' ? event.reason : JSON.stringify(event.reason));
|
|
61
|
+
await handleError(reason);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async function handleError(error) {
|
|
65
|
+
(await loadSentry()).captureException(error);
|
|
66
|
+
}
|
|
67
|
+
function registerDebugHandler() {
|
|
68
|
+
const handler = () => {
|
|
69
|
+
throw new Error('test sentry error');
|
|
70
|
+
};
|
|
71
|
+
Object.defineProperty(window, 'testSentry', {
|
|
72
|
+
set: (enabled) => {
|
|
73
|
+
console.debug(`${enabled ? 'Enable' : 'Disable'} testing sentry for trigger error on click.`);
|
|
74
|
+
if (enabled) {
|
|
75
|
+
document.addEventListener('click', handler);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
document.removeEventListener('click', handler);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const __test__ = import.meta.env?.MODE === 'test'
|
|
84
|
+
? {
|
|
85
|
+
getOptions: () => sentryInitOptions,
|
|
86
|
+
reset: () => {
|
|
87
|
+
sentryInitOptions = {};
|
|
88
|
+
},
|
|
89
|
+
}
|
|
90
|
+
: undefined;
|
|
91
|
+
|
|
92
|
+
export { __test__, configureSentry, handleError, listenGlobalErrors, loadSentry, registerDebugHandler };
|
|
93
|
+
//# sourceMappingURL=sentry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentry.js","sources":["../../../src/observability/sentry/sentry.ts"],"sourcesContent":["import { BrowserOptions } from '@sentry/browser';\nimport { existsEmbeddedData, readEmbeddedData } from '../../dom/embedded-data';\n\nexport * from './integrations';\n\ntype SentryOptions = BrowserOptions & {\n tags?: Record<string, string>;\n}\n\ntype SentryEmbeddedConfig = Readonly<Pick<SentryOptions, 'dsn' | 'environment' | 'release' | 'tags'>>;\n\nlet loadSentryPromise: Promise<typeof import('@sentry/browser')> | null = null;\nlet sentryInitOptions: SentryOptions = {};\n\nexport function configureSentry<K extends keyof SentryOptions>(key: K, value: SentryOptions[K], overwrite: boolean = true): void {\n if (key in sentryInitOptions) {\n if (!overwrite) {\n // Disable overwrite. Ignore.\n return;\n }\n\n const activeValue = sentryInitOptions[key];\n\n if (Array.isArray(value)) {\n value = <SentryOptions[K]>[\n ...(Array.isArray(activeValue) ? activeValue : []),\n ...value,\n ];\n } else if (typeof value === 'object') {\n value = <SentryOptions[K]>{\n ...(typeof activeValue === 'object' ? activeValue : {}),\n ...value,\n };\n }\n }\n\n sentryInitOptions[key] = value;\n}\n\nexport async function loadSentry() {\n if (loadSentryPromise) {\n return loadSentryPromise;\n }\n\n if (existsEmbeddedData('sentry')) {\n const config = readEmbeddedData<SentryEmbeddedConfig>('sentry');\n\n configureSentry('dsn', config.dsn || '', false);\n configureSentry('environment', config.environment || '', false);\n configureSentry('release', config.release || '', false);\n configureSentry('tags', typeof config.tags === 'object' && null !== config.tags ? config.tags : {});\n }\n\n loadSentryPromise = import('@sentry/browser').then((module) => {\n module.init({\n ...sentryInitOptions,\n initialScope: (scope) => {\n if (sentryInitOptions.tags) {\n scope.setTags(sentryInitOptions.tags);\n }\n\n return scope;\n },\n });\n\n return module;\n });\n\n return loadSentryPromise;\n}\n\nexport function listenGlobalErrors(): void {\n window.addEventListener('error', async (event) => {\n const error = event.error ?? new Error(event.message ?? 'Unknown error');\n\n await handleError(error);\n });\n\n window.addEventListener('unhandledrejection', async (event) => {\n const reason = event.reason instanceof Error\n ? event.reason\n : new Error(typeof event.reason === 'string' ? event.reason : JSON.stringify(event.reason));\n\n await handleError(reason);\n });\n}\n\nexport async function handleError(error: unknown): Promise<void> {\n (await loadSentry()).captureException(error);\n}\n\nexport function registerDebugHandler(): void {\n const handler = () => {\n throw new Error('test sentry error');\n };\n\n Object.defineProperty(window, 'testSentry', {\n set: (enabled: boolean) => {\n console.debug(`${enabled ? 'Enable' : 'Disable'} testing sentry for trigger error on click.`);\n\n if (enabled) {\n document.addEventListener('click', handler);\n } else {\n document.removeEventListener('click', handler);\n }\n },\n });\n}\n\nexport const __test__ = import.meta.env?.MODE === 'test'\n ? {\n getOptions: () => sentryInitOptions,\n reset: () => {\n sentryInitOptions = {};\n },\n }\n : undefined;"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './spinner';
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createSpinner(size?: 'small' | 'normal'): HTMLSpanElement;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { addClass } from '../dom/classes.js';
|
|
2
|
+
|
|
3
|
+
function createSpinner(size = 'normal') {
|
|
4
|
+
const spinner = document.createElement('span');
|
|
5
|
+
addClass(spinner, 'spinner-border', 'mr-2');
|
|
6
|
+
spinner.setAttribute('role', 'status');
|
|
7
|
+
if (size === 'small') {
|
|
8
|
+
addClass(spinner, 'spinner-border-sm');
|
|
9
|
+
}
|
|
10
|
+
return spinner;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { createSpinner };
|
|
14
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sources":["../../src/ui/spinner.ts"],"sourcesContent":["import { addClass } from '../dom';\n\nexport function createSpinner(size: 'small' | 'normal' = 'normal'): HTMLSpanElement {\n const spinner = document.createElement('span');\n addClass(spinner, 'spinner-border', 'mr-2');\n spinner.setAttribute('role', 'status');\n\n if (size === 'small') {\n addClass(spinner, 'spinner-border-sm');\n }\n\n return spinner;\n}"],"names":[],"mappings":";;AAEM,SAAU,aAAa,CAAC,IAAA,GAA2B,QAAQ,EAAA;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAC9C,IAAA,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC;AAC3C,IAAA,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AAEtC,IAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AAClB,QAAA,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAC1C;AAEA,IAAA,OAAO,OAAO;AAClB;;;;"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fivelab/web-utils",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "The helpers for easy manipulate with dom.",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"exports": {
|
|
9
|
-
"
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
|
-
"import": "./dist/index.js"
|
|
9
|
+
"./dom": {
|
|
10
|
+
"types": "./dist/dom/index.d.ts",
|
|
11
|
+
"import": "./dist/dom/index.js"
|
|
12
12
|
},
|
|
13
13
|
"./dom/*": {
|
|
14
14
|
"types": "./dist/dom/*.d.ts",
|
|
15
15
|
"import": "./dist/dom/*.js"
|
|
16
|
+
},
|
|
17
|
+
"./behaviors": {
|
|
18
|
+
"types": "./dist/behaviors/index.d.ts",
|
|
19
|
+
"import": "./dist/behaviors/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./behaviors/*": {
|
|
22
|
+
"types": "./dist/behaviors/*.d.ts",
|
|
23
|
+
"import": "./dist/behaviors/*.js"
|
|
24
|
+
},
|
|
25
|
+
"./browser": {
|
|
26
|
+
"types": "./dist/browser/index.d.ts",
|
|
27
|
+
"import": "./dist/browser/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./browser/*": {
|
|
30
|
+
"types": "./dist/browser/*.d.ts",
|
|
31
|
+
"import": "./dist/browser/*.js"
|
|
32
|
+
},
|
|
33
|
+
"./observability": {
|
|
34
|
+
"types": "./dist/observability/index.d.ts",
|
|
35
|
+
"import": "./dist/observability/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./observability/*": {
|
|
38
|
+
"types": "./dist/observability/*.d.ts",
|
|
39
|
+
"import": "./dist/observability/*.js"
|
|
40
|
+
},
|
|
41
|
+
"./ui": {
|
|
42
|
+
"types": "./dist/ui/index.d.ts",
|
|
43
|
+
"import": "./dist/ui/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./ui/*": {
|
|
46
|
+
"types": "./dist/ui/*.d.ts",
|
|
47
|
+
"import": "./dist/ui/*.js"
|
|
16
48
|
}
|
|
17
49
|
},
|
|
18
50
|
"files": [
|
|
@@ -22,15 +54,34 @@
|
|
|
22
54
|
"devDependencies": {
|
|
23
55
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
24
56
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
57
|
+
"@types/toastr": "^2.1.43",
|
|
25
58
|
"@typescript-eslint/eslint-plugin": "~8.50",
|
|
26
59
|
"@typescript-eslint/parser": "~8.50",
|
|
60
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
27
61
|
"eslint": "~9.39",
|
|
28
62
|
"jsdom": "~27.3",
|
|
29
63
|
"rollup": "^4.53.5",
|
|
30
64
|
"rollup-plugin-dts": "^6.3.0",
|
|
31
65
|
"typescript": "~5.9",
|
|
66
|
+
"vite": "^7.3.0",
|
|
32
67
|
"vitest": "~4.0"
|
|
33
68
|
},
|
|
69
|
+
"peerDependencies": {
|
|
70
|
+
"@sentry/browser": "^10.0",
|
|
71
|
+
"toastr": "^2.0",
|
|
72
|
+
"notyf": "^3.0"
|
|
73
|
+
},
|
|
74
|
+
"peerDependenciesMeta": {
|
|
75
|
+
"@sentry/browser": {
|
|
76
|
+
"optional": true
|
|
77
|
+
},
|
|
78
|
+
"toastr": {
|
|
79
|
+
"optional": true
|
|
80
|
+
},
|
|
81
|
+
"notyf": {
|
|
82
|
+
"optional": true
|
|
83
|
+
}
|
|
84
|
+
},
|
|
34
85
|
"scripts": {
|
|
35
86
|
"clean": "rm -rf dist/*",
|
|
36
87
|
"build:js": "rollup -c",
|
|
@@ -38,7 +89,9 @@
|
|
|
38
89
|
"build": "npm run clean && npm run build:js && npm run build:types",
|
|
39
90
|
"test": "vitest run",
|
|
40
91
|
"test:watch": "vitest",
|
|
92
|
+
"test:coverage": "vitest run --coverage",
|
|
41
93
|
"lint": "eslint src",
|
|
94
|
+
"dev": "vite",
|
|
42
95
|
"prepublishOnly": "npm run clean && npm run lint && npm run test && npm run build"
|
|
43
96
|
},
|
|
44
97
|
"publishConfig": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom-changes.js","sources":["../../src/dom/dom-changes.ts"],"sourcesContent":["import { onDomReady } from './dom-ready';\n\ntype BaseDomChangeOptions = MutationObserverInit & {\n readonly onDomReady?: boolean; // execute handler after dom ready?\n readonly target?: string; // where we must see changes?\n}\n\ntype SelectorDomChangeOptions = BaseDomChangeOptions & {\n readonly selector?: string; // what element we find?\n selectors?: never;\n}\n\ntype SelectorsDomChangeOptions = BaseDomChangeOptions & {\n readonly selectors?: DomChangeCallbacks; // each selector must contain callback function\n selector?: never;\n}\n\ntype DomChangeOptions = SelectorsDomChangeOptions | SelectorDomChangeOptions;\n\nexport type DomChangeCallback = (target: Element, item?: MutationRecord) => void;\nexport type DomChangeCallbacks = Record<string, DomChangeCallback>;\n\nexport function onDomChanges(options: SelectorDomChangeOptions, callback: DomChangeCallback): void;\nexport function onDomChanges(options: SelectorsDomChangeOptions): void;\n\nexport function onDomChanges(options: DomChangeOptions, callback?: DomChangeCallback): void {\n if (options.selector && options.selectors) {\n throw new Error('Only one option must be provided: either selector or selectors, not both.');\n }\n\n if (options.selectors && callback) {\n throw new Error('Only one option must be provided: either selectors or callback, not both.');\n }\n\n function changesOnElementWithSelector(element: HTMLElement, handler: DomChangeCallback, item?: MutationRecord, selector?: string): void {\n if (selector) {\n if (element.matches(selector)) {\n handler.call(null, element, item);\n } else {\n element.querySelectorAll(selector).forEach((innerElement) => {\n handler.call(null, innerElement, item);\n });\n }\n } else {\n handler.call(null, element, item);\n }\n }\n\n function changesOnElementWithSelectors(element: HTMLElement, selectors: DomChangeCallbacks, item?: MutationRecord): void {\n Object.entries(selectors).forEach(([selector, handler]) => {\n changesOnElementWithSelector.call(null, element, handler, item, selector);\n });\n }\n\n let selectors: DomChangeCallbacks | undefined = undefined;\n\n if (options.selectors) {\n selectors = options.selectors;\n } else if (options.selector) {\n if (!callback) {\n throw new Error('Missed callback.');\n }\n\n selectors = {};\n selectors[options.selector] = callback;\n }\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((item) => {\n item.addedNodes.forEach((node) => {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n if (selectors) {\n changesOnElementWithSelectors(node, selectors, item);\n } else {\n if (!callback) {\n throw new Error('Missed callback.');\n }\n\n changesOnElementWithSelector(node, callback, item);\n }\n });\n\n if (item.attributeName) {\n callback?.call(null, <Element>item.target, item);\n }\n });\n });\n\n onDomReady(() => {\n const target = <HTMLElement>(options.target ? document.querySelector(options.target) : document.body);\n\n if (!target) {\n console.debug(`The target with selector \"${options.target}\" for listen page changes was not found.`);\n\n return;\n }\n\n observer.observe(target, options);\n\n if (options.onDomReady) {\n if (!selectors) {\n throw new Error('Selector or selectors is required for enable \"on dom ready\".');\n }\n\n changesOnElementWithSelectors(target, selectors);\n }\n });\n}\n"],"names":[],"mappings":"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"}
|
package/dist/dom/dom-events.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export type EventHandler = (element: Element, event: Event) => void;
|
|
2
|
-
export type EventHandlers = Record<string, EventHandler>;
|
|
3
|
-
type EventName = 'click' | 'change';
|
|
4
|
-
type Selector = string;
|
|
5
|
-
type BaseListenOptions = {
|
|
6
|
-
readonly target?: string | HTMLElement;
|
|
7
|
-
};
|
|
8
|
-
type SelectorListenOptions = BaseListenOptions & {
|
|
9
|
-
readonly selector: Selector;
|
|
10
|
-
selectors?: never;
|
|
11
|
-
};
|
|
12
|
-
type SelectorsListenOptions = BaseListenOptions & {
|
|
13
|
-
readonly selectors: EventHandlers;
|
|
14
|
-
selector?: never;
|
|
15
|
-
};
|
|
16
|
-
export declare function onDomEvents(eventName: EventName, options: SelectorListenOptions | string, handler: EventHandler): void;
|
|
17
|
-
export declare function onDomEvents(eventName: EventName, options: SelectorsListenOptions): void;
|
|
18
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom-events.js","sources":["../../src/dom/dom-events.ts"],"sourcesContent":["import { onDomReady } from './dom-ready';\n\nexport type EventHandler = (element: Element, event: Event) => void;\nexport type EventHandlers = Record<string, EventHandler>;\n\ntype EventName = 'click' | 'change';\ntype Selector = string;\n\ntype BaseListenOptions = {\n readonly target?: string | HTMLElement;\n}\n\ntype SelectorListenOptions = BaseListenOptions & {\n readonly selector: Selector;\n selectors?: never;\n}\n\ntype SelectorsListenOptions = BaseListenOptions & {\n readonly selectors: EventHandlers;\n selector?: never;\n}\n\nexport function onDomEvents(eventName: EventName, options: SelectorListenOptions | string, handler: EventHandler): void;\nexport function onDomEvents(eventName: EventName, options: SelectorsListenOptions): void;\n\nexport function onDomEvents(eventName: EventName, options: SelectorListenOptions | SelectorsListenOptions | string, handler?: EventHandler): void {\n if (typeof options === 'string') {\n options = <SelectorListenOptions>{\n selector: options,\n };\n }\n\n if (options.selectors && handler) {\n throw new Error('Only one option must be provided: either selectors or callback, not both.');\n }\n\n let selectors: EventHandlers;\n\n if (options.selectors) {\n selectors = options.selectors;\n } else {\n if (!handler) {\n throw new Error('Missed handler');\n }\n\n selectors = {};\n selectors[options.selector] = handler;\n }\n\n const findHandler = (selectors: EventHandlers, element: HTMLElement): [HTMLElement, EventHandler] | null => {\n for (const [selector, handler] of Object.entries(selectors)) {\n if (element.matches(selector)) {\n return [element, handler];\n }\n\n const parent = <HTMLElement>element.closest(selector);\n\n if (parent) {\n return [parent, handler];\n }\n }\n\n return null;\n };\n\n onDomReady(() => {\n let target: Element | null = document.body;\n\n if (options.target) {\n target = options.target instanceof Element ? options.target : document.querySelector(options.target);\n\n if (!target) {\n throw new Error(`Missed target element by selector \"${options.target}\".`);\n }\n }\n\n target.addEventListener(eventName, (event): void => {\n const target = <HTMLElement>event.target;\n const entry = findHandler(selectors, target);\n\n if (entry) {\n entry[1].call(null, entry[0], event);\n }\n });\n });\n}\n"],"names":[],"mappings":";;SAyBgB,WAAW,CAAC,SAAoB,EAAE,OAAgE,EAAE,OAAsB,EAAA;AACtI,IAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,GAA0B;AAC7B,YAAA,QAAQ,EAAE,OAAO;SACpB;IACL;AAEA,IAAA,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,EAAE;AAC9B,QAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;IAChG;AAEA,IAAA,IAAI,SAAwB;AAE5B,IAAA,IAAI,OAAO,CAAC,SAAS,EAAE;AACnB,QAAA,SAAS,GAAG,OAAO,CAAC,SAAS;IACjC;SAAO;QACH,IAAI,CAAC,OAAO,EAAE;AACV,YAAA,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC;QACrC;QAEA,SAAS,GAAG,EAAE;AACd,QAAA,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO;IACzC;AAEA,IAAA,MAAM,WAAW,GAAG,CAAC,SAAwB,EAAE,OAAoB,KAAwC;AACvG,QAAA,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AACzD,YAAA,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3B,gBAAA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;YAC7B;YAEA,MAAM,MAAM,GAAgB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAErD,IAAI,MAAM,EAAE;AACR,gBAAA,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YAC5B;QACJ;AAEA,QAAA,OAAO,IAAI;AACf,IAAA,CAAC;IAED,UAAU,CAAC,MAAK;AACZ,QAAA,IAAI,MAAM,GAAmB,QAAQ,CAAC,IAAI;AAE1C,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;YAChB,MAAM,GAAG,OAAO,CAAC,MAAM,YAAY,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YAEpG,IAAI,CAAC,MAAM,EAAE;gBACT,MAAM,IAAI,KAAK,CAAC,CAAA,mCAAA,EAAsC,OAAO,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;YAC7E;QACJ;QAEA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,KAAU;AAC/C,YAAA,MAAM,MAAM,GAAgB,KAAK,CAAC,MAAM;YACxC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC;YAE5C,IAAI,KAAK,EAAE;AACP,gBAAA,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;YACxC;AACJ,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,CAAC;AACN;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom-ready.js","sources":["../../src/dom/dom-ready.ts"],"sourcesContent":["export type DomReadyCallback = () => void;\n\nexport function onDomReady(callback: DomReadyCallback): void;\nexport function onDomReady(callback: Array<DomReadyCallback>): void\n\nexport function onDomReady(callback: DomReadyCallback | Array<DomReadyCallback>): void {\n let wrap: DomReadyCallback;\n\n if (Array.isArray(callback)) {\n wrap = () => callback.forEach((c) => c.call(null));\n } else {\n wrap = callback;\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', wrap, {\n once: true,\n });\n } else {\n wrap.call(null);\n }\n}\n"],"names":[],"mappings":"AAKM,SAAU,UAAU,CAAC,QAAoD,EAAA;AAC3E,IAAA,IAAI,IAAsB;AAE1B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QACzB,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD;SAAO;QACH,IAAI,GAAG,QAAQ;IACnB;AAEA,IAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;AACnC,QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,EAAE;AAChD,YAAA,IAAI,EAAE,IAAI;AACb,SAAA,CAAC;IACN;SAAO;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACnB;AACJ;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom-visibility.js","sources":["../../src/dom/dom-visibility.ts"],"sourcesContent":["export function showElement(element: HTMLElement): void {\n element.classList.remove('d-none');\n}\n\nexport function hideElement(element: HTMLElement): void {\n element.classList.add('d-none');\n}\n"],"names":[],"mappings":"AAAM,SAAU,WAAW,CAAC,OAAoB,EAAA;AAC5C,IAAA,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AACtC;AAEM,SAAU,WAAW,CAAC,OAAoB,EAAA;AAC5C,IAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AACnC;;;;"}
|
package/dist/index.d.ts
DELETED
package/dist/index.js
DELETED
|
File without changes
|