@fivelab/web-utils 1.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/README.md +10 -0
- package/dist/dom/dom-changes.d.ts +17 -0
- package/dist/dom/dom-changes.js +76 -0
- package/dist/dom/dom-changes.js.map +1 -0
- package/dist/dom/dom-events.d.ts +18 -0
- package/dist/dom/dom-events.js +51 -0
- package/dist/dom/dom-events.js.map +1 -0
- package/dist/dom/dom-ready.d.ts +3 -0
- package/dist/dom/dom-ready.js +18 -0
- package/dist/dom/dom-ready.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type BaseDomChangeOptions = MutationObserverInit & {
|
|
2
|
+
readonly onDomReady?: boolean;
|
|
3
|
+
readonly target?: string;
|
|
4
|
+
};
|
|
5
|
+
type SelectorDomChangeOptions = BaseDomChangeOptions & {
|
|
6
|
+
readonly selector?: string;
|
|
7
|
+
selectors?: never;
|
|
8
|
+
};
|
|
9
|
+
type SelectorsDomChangeOptions = BaseDomChangeOptions & {
|
|
10
|
+
readonly selectors?: DomChangeCallbacks;
|
|
11
|
+
selector?: never;
|
|
12
|
+
};
|
|
13
|
+
export type DomChangeCallback = (target: Element, item?: MutationRecord) => void;
|
|
14
|
+
export type DomChangeCallbacks = Record<string, DomChangeCallback>;
|
|
15
|
+
export declare function onDomChanges(options: SelectorDomChangeOptions, callback: DomChangeCallback): void;
|
|
16
|
+
export declare function onDomChanges(options: SelectorsDomChangeOptions): void;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { onDomReady } from './dom-ready';
|
|
2
|
+
export function onDomChanges(options, callback) {
|
|
3
|
+
if (options.selector && options.selectors) {
|
|
4
|
+
throw new Error('Only one option must be provided: either selector or selectors, not both.');
|
|
5
|
+
}
|
|
6
|
+
if (options.selectors && callback) {
|
|
7
|
+
throw new Error('Only one option must be provided: either selectors or callback, not both.');
|
|
8
|
+
}
|
|
9
|
+
function changesOnElementWithSelector(element, handler, item, selector) {
|
|
10
|
+
if (selector) {
|
|
11
|
+
if (element.matches(selector)) {
|
|
12
|
+
handler.call(null, element, item);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
element.querySelectorAll(selector).forEach((innerElement) => {
|
|
16
|
+
handler.call(null, innerElement, item);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
handler.call(null, element, item);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function changesOnElementWithSelectors(element, selectors, item) {
|
|
25
|
+
Object.entries(selectors).forEach(([selector, handler]) => {
|
|
26
|
+
changesOnElementWithSelector.call(null, element, handler, item, selector);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
let selectors = undefined;
|
|
30
|
+
if (options.selectors) {
|
|
31
|
+
selectors = options.selectors;
|
|
32
|
+
}
|
|
33
|
+
else if (options.selector) {
|
|
34
|
+
if (!callback) {
|
|
35
|
+
throw new Error('Missed callback.');
|
|
36
|
+
}
|
|
37
|
+
selectors = {};
|
|
38
|
+
selectors[options.selector] = callback;
|
|
39
|
+
}
|
|
40
|
+
const observer = new MutationObserver((mutations) => {
|
|
41
|
+
mutations.forEach((item) => {
|
|
42
|
+
item.addedNodes.forEach((node) => {
|
|
43
|
+
if (!(node instanceof HTMLElement)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (selectors) {
|
|
47
|
+
changesOnElementWithSelectors(node, selectors, item);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
if (!callback) {
|
|
51
|
+
throw new Error('Missed callback.');
|
|
52
|
+
}
|
|
53
|
+
changesOnElementWithSelector(node, callback, item);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
if (item.attributeName) {
|
|
57
|
+
callback?.call(null, item.target, item);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
onDomReady(() => {
|
|
62
|
+
const target = (options.target ? document.querySelector(options.target) : document.body);
|
|
63
|
+
if (!target) {
|
|
64
|
+
console.debug(`The target with selector "${options.target}" for listen page changes was not found.`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
observer.observe(target, options);
|
|
68
|
+
if (options.onDomReady) {
|
|
69
|
+
if (!selectors) {
|
|
70
|
+
throw new Error('Selector or selectors is required for enable "on dom ready".');
|
|
71
|
+
}
|
|
72
|
+
changesOnElementWithSelectors(target, selectors);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=dom-changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-changes.js","sourceRoot":"","sources":["../../src/dom/dom-changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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 {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { onDomReady } from './dom-ready';
|
|
2
|
+
export function onDomEvents(eventName, options, handler) {
|
|
3
|
+
if (typeof options === 'string') {
|
|
4
|
+
options = {
|
|
5
|
+
selector: options,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
if (options.selectors && handler) {
|
|
9
|
+
throw new Error('Only one option must be provided: either selectors or callback, not both.');
|
|
10
|
+
}
|
|
11
|
+
let selectors;
|
|
12
|
+
if (options.selectors) {
|
|
13
|
+
selectors = options.selectors;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
if (!handler) {
|
|
17
|
+
throw new Error('Missed handler');
|
|
18
|
+
}
|
|
19
|
+
selectors = {};
|
|
20
|
+
selectors[options.selector] = handler;
|
|
21
|
+
}
|
|
22
|
+
const findHandler = (selectors, element) => {
|
|
23
|
+
for (const [selector, handler] of Object.entries(selectors)) {
|
|
24
|
+
if (element.matches(selector)) {
|
|
25
|
+
return [element, handler];
|
|
26
|
+
}
|
|
27
|
+
const parent = element.closest(selector);
|
|
28
|
+
if (parent) {
|
|
29
|
+
return [parent, handler];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
34
|
+
onDomReady(() => {
|
|
35
|
+
let target = document.body;
|
|
36
|
+
if (options.target) {
|
|
37
|
+
target = options.target instanceof Element ? options.target : document.querySelector(options.target);
|
|
38
|
+
if (!target) {
|
|
39
|
+
throw new Error(`Missed target element by selector "${options.target}".`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
target.addEventListener(eventName, (event) => {
|
|
43
|
+
const target = event.target;
|
|
44
|
+
const entry = findHandler(selectors, target);
|
|
45
|
+
if (entry) {
|
|
46
|
+
entry[1].call(null, entry[0], event);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=dom-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-events.js","sourceRoot":"","sources":["../../src/dom/dom-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyBzC,MAAM,UAAU,WAAW,CAAC,SAAoB,EAAE,OAAgE,EAAE,OAAsB;IACtI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,GAA0B;YAC7B,QAAQ,EAAE,OAAO;SACpB,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,SAAwB,CAAC;IAE7B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAClC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;QAED,SAAS,GAAG,EAAE,CAAC;QACf,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAC1C,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,SAAwB,EAAE,OAAoB,EAAsC,EAAE;QACvG,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,CAAC;YAED,MAAM,MAAM,GAAgB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAEtD,IAAI,MAAM,EAAE,CAAC;gBACT,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACZ,IAAI,MAAM,GAAmB,QAAQ,CAAC,IAAI,CAAC;QAE3C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,GAAG,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAErG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YAC9E,CAAC;QACL,CAAC;QAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAQ,EAAE;YAC/C,MAAM,MAAM,GAAgB,KAAK,CAAC,MAAM,CAAC;YACzC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAE7C,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function onDomReady(callback) {
|
|
2
|
+
let wrap;
|
|
3
|
+
if (Array.isArray(callback)) {
|
|
4
|
+
wrap = () => callback.forEach((c) => c.call(null));
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
wrap = callback;
|
|
8
|
+
}
|
|
9
|
+
if (document.readyState === 'loading') {
|
|
10
|
+
document.addEventListener('DOMContentLoaded', wrap, {
|
|
11
|
+
once: true,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
wrap.call(null);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=dom-ready.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-ready.js","sourceRoot":"","sources":["../../src/dom/dom-ready.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,UAAU,CAAC,QAAoD;IAC3E,IAAI,IAAsB,CAAC;IAE3B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACJ,IAAI,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,EAAE;YAChD,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;IACP,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fivelab/web-utils",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "The helpers for easy manipulate with dom.",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./dom/*": {
|
|
14
|
+
"types": "./dist/dom/*.d.ts",
|
|
15
|
+
"import": "./dist/dom/*.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@typescript-eslint/eslint-plugin": "~8.50",
|
|
24
|
+
"@typescript-eslint/parser": "~8.50",
|
|
25
|
+
"eslint": "~9.39",
|
|
26
|
+
"jsdom": "~27.3",
|
|
27
|
+
"typescript": "~5.9",
|
|
28
|
+
"vitest": "~4.0"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"clean": "rm -rf dist/*",
|
|
32
|
+
"build": "npm run clean && tsc -p tsconfig.build.json",
|
|
33
|
+
"build:watch": "tsc -p tsconfig.build.json --watch",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"lint": "eslint src",
|
|
37
|
+
"prepublishOnly": "npm run clean && npm run lint && npm run test && npm run build"
|
|
38
|
+
}
|
|
39
|
+
}
|