mount-observer 0.1.2 → 0.1.3
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/DefineCustomElementHandler.js +64 -0
- package/DefineCustomElementHandler.ts +77 -0
- package/Events.js +11 -9
- package/Events.ts +9 -4
- package/EvtRt.js +34 -0
- package/EvtRt.ts +42 -0
- package/MountObserver.js +211 -41
- package/MountObserver.ts +252 -42
- package/README.md +519 -185
- package/SharedMutationObserver.js +9 -6
- package/SharedMutationObserver.ts +11 -8
- package/arr.js +13 -0
- package/arr.ts +13 -0
- package/emitEvents.js +1 -1
- package/emitEvents.ts +1 -1
- package/index.js +13 -1
- package/index.ts +10 -1
- package/loadImports.js +2 -1
- package/loadImports.ts +2 -1
- package/mediaQuery.js +2 -7
- package/mediaQuery.ts +2 -7
- package/package.json +15 -3
- package/types.d.ts +21 -15
|
@@ -14,6 +14,12 @@ const sharedObservers = new WeakMap();
|
|
|
14
14
|
export function registerSharedObserver(rootNode, callback, config) {
|
|
15
15
|
let sharedData = sharedObservers.get(rootNode);
|
|
16
16
|
if (!sharedData) {
|
|
17
|
+
// Create shared data structure first
|
|
18
|
+
sharedData = {
|
|
19
|
+
observer: null, // Will be set immediately below
|
|
20
|
+
callbacks: new Set(),
|
|
21
|
+
config
|
|
22
|
+
};
|
|
17
23
|
// Create new shared observer for this root node
|
|
18
24
|
const observer = new MutationObserver((mutations) => {
|
|
19
25
|
// Distribute mutations to all registered callbacks
|
|
@@ -22,13 +28,10 @@ export function registerSharedObserver(rootNode, callback, config) {
|
|
|
22
28
|
cb(mutations);
|
|
23
29
|
}
|
|
24
30
|
});
|
|
25
|
-
observer
|
|
26
|
-
sharedData = {
|
|
27
|
-
observer,
|
|
28
|
-
callbacks: new Set(),
|
|
29
|
-
config
|
|
30
|
-
};
|
|
31
|
+
sharedData.observer = observer;
|
|
31
32
|
sharedObservers.set(rootNode, sharedData);
|
|
33
|
+
// Start observing after everything is set up
|
|
34
|
+
observer.observe(rootNode, config);
|
|
32
35
|
}
|
|
33
36
|
else {
|
|
34
37
|
// Verify config matches (for safety)
|
|
@@ -29,6 +29,13 @@ export function registerSharedObserver(
|
|
|
29
29
|
let sharedData = sharedObservers.get(rootNode);
|
|
30
30
|
|
|
31
31
|
if (!sharedData) {
|
|
32
|
+
// Create shared data structure first
|
|
33
|
+
sharedData = {
|
|
34
|
+
observer: null as any, // Will be set immediately below
|
|
35
|
+
callbacks: new Set(),
|
|
36
|
+
config
|
|
37
|
+
};
|
|
38
|
+
|
|
32
39
|
// Create new shared observer for this root node
|
|
33
40
|
const observer = new MutationObserver((mutations) => {
|
|
34
41
|
// Distribute mutations to all registered callbacks
|
|
@@ -38,15 +45,11 @@ export function registerSharedObserver(
|
|
|
38
45
|
}
|
|
39
46
|
});
|
|
40
47
|
|
|
41
|
-
observer
|
|
42
|
-
|
|
43
|
-
sharedData = {
|
|
44
|
-
observer,
|
|
45
|
-
callbacks: new Set(),
|
|
46
|
-
config
|
|
47
|
-
};
|
|
48
|
-
|
|
48
|
+
sharedData.observer = observer;
|
|
49
49
|
sharedObservers.set(rootNode, sharedData);
|
|
50
|
+
|
|
51
|
+
// Start observing after everything is set up
|
|
52
|
+
observer.observe(rootNode, config);
|
|
50
53
|
} else {
|
|
51
54
|
// Verify config matches (for safety)
|
|
52
55
|
// In practice, all MountObservers should use the same config
|
package/arr.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility function to normalize a value to an array.
|
|
3
|
+
* - If undefined, returns empty array
|
|
4
|
+
* - If already an array, returns as-is
|
|
5
|
+
* - Otherwise, wraps the value in an array
|
|
6
|
+
*
|
|
7
|
+
* @param inp - Value to normalize to array
|
|
8
|
+
* @returns Array containing the value(s)
|
|
9
|
+
*/
|
|
10
|
+
export function arr(inp) {
|
|
11
|
+
return inp === undefined ? []
|
|
12
|
+
: Array.isArray(inp) ? inp : [inp];
|
|
13
|
+
}
|
package/arr.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility function to normalize a value to an array.
|
|
3
|
+
* - If undefined, returns empty array
|
|
4
|
+
* - If already an array, returns as-is
|
|
5
|
+
* - Otherwise, wraps the value in an array
|
|
6
|
+
*
|
|
7
|
+
* @param inp - Value to normalize to array
|
|
8
|
+
* @returns Array containing the value(s)
|
|
9
|
+
*/
|
|
10
|
+
export function arr<T = any>(inp: T | T[] | undefined): T[] {
|
|
11
|
+
return inp === undefined ? []
|
|
12
|
+
: Array.isArray(inp) ? inp : [inp];
|
|
13
|
+
}
|
package/emitEvents.js
CHANGED
|
@@ -57,7 +57,7 @@ async function emitSingleEvent(element, mountInit, config, processedEventsForEle
|
|
|
57
57
|
}
|
|
58
58
|
// Apply eventProps if specified
|
|
59
59
|
if (config.eventProps) {
|
|
60
|
-
const { assignGingerly } = await import('assign-gingerly/
|
|
60
|
+
const { assignGingerly } = await import('assign-gingerly/assignGingerly.js');
|
|
61
61
|
const processedProps = processMagicStrings(config.eventProps, element, mountInit);
|
|
62
62
|
assignGingerly(event, processedProps);
|
|
63
63
|
}
|
package/emitEvents.ts
CHANGED
|
@@ -73,7 +73,7 @@ async function emitSingleEvent(
|
|
|
73
73
|
|
|
74
74
|
// Apply eventProps if specified
|
|
75
75
|
if (config.eventProps) {
|
|
76
|
-
const { assignGingerly } = await import('assign-gingerly/
|
|
76
|
+
const { assignGingerly } = await import('assign-gingerly/assignGingerly.js');
|
|
77
77
|
const processedProps = processMagicStrings(config.eventProps, element, mountInit);
|
|
78
78
|
assignGingerly(event, processedProps);
|
|
79
79
|
}
|
package/index.js
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
// Main entry point for MountObserver v2
|
|
2
2
|
export { MountObserver } from './MountObserver.js';
|
|
3
|
-
export {
|
|
3
|
+
export { whereOutside } from './whereOutside.js';
|
|
4
|
+
export { emitMountedElementEvents } from './emitEvents.js';
|
|
5
|
+
export { checkAttrChanges } from './attrChanges.js';
|
|
6
|
+
export { arr } from './arr.js';
|
|
7
|
+
export { EvtRt } from './EvtRt.js';
|
|
8
|
+
export { DefineCustomElementHandler } from './DefineCustomElementHandler.js';
|
|
9
|
+
export { mountEventName, dismountEventName, disconnectEventName, loadEventName, attrchangeEventName, mediamatchEventName, mediaunmatchEventName } from './Events.js';
|
|
10
|
+
// Register built-in handlers
|
|
11
|
+
import { MountObserver } from './MountObserver.js';
|
|
12
|
+
import { EvtRt } from './EvtRt.js';
|
|
13
|
+
import { DefineCustomElementHandler } from './DefineCustomElementHandler.js';
|
|
14
|
+
MountObserver.define('builtIns.logToConsole', EvtRt);
|
|
15
|
+
MountObserver.define('builtIns.defineCustomElement', DefineCustomElementHandler);
|
package/index.ts
CHANGED
|
@@ -3,13 +3,15 @@ export { MountObserver } from './MountObserver.js';
|
|
|
3
3
|
export { whereOutside } from './whereOutside.js';
|
|
4
4
|
export { emitMountedElementEvents } from './emitEvents.js';
|
|
5
5
|
export { checkAttrChanges } from './attrChanges.js';
|
|
6
|
+
export { arr } from './arr.js';
|
|
7
|
+
export { EvtRt } from './EvtRt.js';
|
|
8
|
+
export { DefineCustomElementHandler } from './DefineCustomElementHandler.js';
|
|
6
9
|
export type {
|
|
7
10
|
MountInit,
|
|
8
11
|
MountObserverOptions,
|
|
9
12
|
IMountObserver,
|
|
10
13
|
MountContext,
|
|
11
14
|
DoCallback,
|
|
12
|
-
DoCallbacks,
|
|
13
15
|
ImportSpec,
|
|
14
16
|
IMountEvent,
|
|
15
17
|
IDismountEvent
|
|
@@ -24,3 +26,10 @@ export {
|
|
|
24
26
|
mediaunmatchEventName
|
|
25
27
|
} from './Events.js';
|
|
26
28
|
|
|
29
|
+
// Register built-in handlers
|
|
30
|
+
import { MountObserver } from './MountObserver.js';
|
|
31
|
+
import { EvtRt } from './EvtRt.js';
|
|
32
|
+
import { DefineCustomElementHandler } from './DefineCustomElementHandler.js';
|
|
33
|
+
|
|
34
|
+
MountObserver.define('builtIns.logToConsole', EvtRt);
|
|
35
|
+
MountObserver.define('builtIns.defineCustomElement', DefineCustomElementHandler);
|
package/loadImports.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Dynamic import loading utilities
|
|
2
2
|
// Only loaded when MountInit.import is specified
|
|
3
|
+
import { arr } from './arr.js';
|
|
3
4
|
export async function loadImports(imports) {
|
|
4
|
-
const importArray =
|
|
5
|
+
const importArray = arr(imports);
|
|
5
6
|
const promises = importArray.map(imp => loadSingleImport(imp));
|
|
6
7
|
return Promise.all(promises);
|
|
7
8
|
}
|
package/loadImports.ts
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
// Only loaded when MountInit.import is specified
|
|
3
3
|
|
|
4
4
|
import { ImportSpec } from './types.js';
|
|
5
|
+
import { arr } from './arr.js';
|
|
5
6
|
|
|
6
7
|
export async function loadImports(
|
|
7
8
|
imports: string | ImportSpec | Array<string | ImportSpec | [string, any]>
|
|
8
9
|
): Promise<any[]> {
|
|
9
|
-
const importArray =
|
|
10
|
+
const importArray = arr(imports);
|
|
10
11
|
const promises = importArray.map(imp => loadSingleImport(imp));
|
|
11
12
|
return Promise.all(promises);
|
|
12
13
|
}
|
package/mediaQuery.js
CHANGED
|
@@ -48,9 +48,8 @@ export function setupMediaQuery(init, rootNodeRef, mountedElements, modules, obs
|
|
|
48
48
|
const context = {
|
|
49
49
|
modules,
|
|
50
50
|
observer: observer,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
51
|
+
rootNode,
|
|
52
|
+
mountInit: init
|
|
54
53
|
};
|
|
55
54
|
// Get all mounted elements from the WeakDual setWeak
|
|
56
55
|
const mountedElementsList = [];
|
|
@@ -70,10 +69,6 @@ export function setupMediaQuery(init, rootNodeRef, mountedElements, modules, obs
|
|
|
70
69
|
break;
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
|
-
// Call dismount callback
|
|
74
|
-
if (init.do && typeof init.do !== 'function' && init.do.dismount) {
|
|
75
|
-
init.do.dismount(element, context);
|
|
76
|
-
}
|
|
77
72
|
// Dispatch dismount event with reason
|
|
78
73
|
observer.dispatchEvent(new DismountEvent(element, 'media-query-failed', init));
|
|
79
74
|
}
|
package/mediaQuery.ts
CHANGED
|
@@ -69,9 +69,8 @@ export function setupMediaQuery(
|
|
|
69
69
|
const context: MountContext = {
|
|
70
70
|
modules,
|
|
71
71
|
observer: observer as any,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
72
|
+
rootNode,
|
|
73
|
+
mountInit: init
|
|
75
74
|
};
|
|
76
75
|
|
|
77
76
|
// Get all mounted elements from the WeakDual setWeak
|
|
@@ -94,10 +93,6 @@ export function setupMediaQuery(
|
|
|
94
93
|
}
|
|
95
94
|
}
|
|
96
95
|
|
|
97
|
-
// Call dismount callback
|
|
98
|
-
if (init.do && typeof init.do !== 'function' && init.do.dismount) {
|
|
99
|
-
init.do.dismount(element, context);
|
|
100
|
-
}
|
|
101
96
|
|
|
102
97
|
// Dispatch dismount event with reason
|
|
103
98
|
observer.dispatchEvent(new DismountEvent(element, 'media-query-failed', init));
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mount-observer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Observe and act on css matches.",
|
|
5
5
|
"main": "MountObserver.js",
|
|
6
6
|
"module": "MountObserver.js",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"assign-gingerly": "0.0.
|
|
8
|
+
"assign-gingerly": "0.0.6"
|
|
9
9
|
},
|
|
10
10
|
"devDependencies": {
|
|
11
|
-
"@playwright/test": "1.58.
|
|
11
|
+
"@playwright/test": "1.58.2",
|
|
12
12
|
"spa-ssi": "0.0.26"
|
|
13
13
|
},
|
|
14
14
|
"exports": {
|
|
@@ -31,6 +31,18 @@
|
|
|
31
31
|
"./attrChanges.js": {
|
|
32
32
|
"default": "./attrChanges.js",
|
|
33
33
|
"types": "./attrChanges.ts"
|
|
34
|
+
},
|
|
35
|
+
"./arr.js": {
|
|
36
|
+
"default": "./arr.js",
|
|
37
|
+
"types": "./arr.ts"
|
|
38
|
+
},
|
|
39
|
+
"./EvtRt.js": {
|
|
40
|
+
"default": "./EvtRt.js",
|
|
41
|
+
"types": "./EvtRt.ts"
|
|
42
|
+
},
|
|
43
|
+
"./DefineCustomElementHandler.js": {
|
|
44
|
+
"default": "./DefineCustomElementHandler.js",
|
|
45
|
+
"types": "./DefineCustomElementHandler.ts"
|
|
34
46
|
}
|
|
35
47
|
},
|
|
36
48
|
"files": [
|
package/types.d.ts
CHANGED
|
@@ -22,12 +22,17 @@ export interface MountInit {
|
|
|
22
22
|
whereMediaMatches?: string | MediaQueryList;
|
|
23
23
|
whereOutside?: string;
|
|
24
24
|
import?: string | ImportSpec | Array<string | ImportSpec>;
|
|
25
|
-
do?: DoCallback |
|
|
25
|
+
do?: string | DoCallback | (string | DoCallback)[];
|
|
26
26
|
loadingEagerness?: 'eager' | 'lazy';
|
|
27
|
-
|
|
27
|
+
assignOnMount?: Record<string, any>;
|
|
28
|
+
assignOnDismount?: Record<string, any>;
|
|
28
29
|
map?: MapConfig;
|
|
29
30
|
getPlayByPlay?: boolean;
|
|
30
31
|
mountedElemEmits?: EventConfig | EventConfig[];
|
|
32
|
+
reference?: number | number[];
|
|
33
|
+
//allow handler classes or functions
|
|
34
|
+
//to be passed some custom information
|
|
35
|
+
customData?: unknown;
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
export interface MapConfig {
|
|
@@ -62,21 +67,20 @@ export interface ImportSpec {
|
|
|
62
67
|
export interface MountContext {
|
|
63
68
|
modules: any[];
|
|
64
69
|
observer: IMountObserver;
|
|
65
|
-
observeInfo: ObserveInfo;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export interface ObserveInfo {
|
|
69
70
|
rootNode: Node;
|
|
71
|
+
mountInit: MountInit
|
|
70
72
|
}
|
|
71
73
|
|
|
72
|
-
export type DoCallback = (matchingElement: Element, context: MountContext) => void;
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
75
|
+
|
|
76
|
+
export type DoCallback = (mountedElement: Element, context: MountContext) => void;
|
|
77
|
+
|
|
78
|
+
// export interface DoCallbacks {
|
|
79
|
+
// mount?: (mountedElement: Element, context: MountContext) => void;
|
|
80
|
+
// dismount?: (mountedElement: Element, context: MountContext) => void;
|
|
81
|
+
// disconnect?: (mountedElement: Element, context: MountContext) => void;
|
|
82
|
+
// reconnect?: (mountedElement: Element, context: MountContext) => void;
|
|
83
|
+
// }
|
|
80
84
|
|
|
81
85
|
export interface MountObserverOptions {
|
|
82
86
|
disconnectedSignal?: AbortSignal;
|
|
@@ -92,16 +96,18 @@ export interface IMountObserver extends EventTarget {
|
|
|
92
96
|
disconnect(): void;
|
|
93
97
|
disconnectedSignal: AbortSignal;
|
|
94
98
|
assignGingerly(config: Record<string, any> | undefined): Promise<void>;
|
|
99
|
+
getNotifier(element: Element): EventTarget;
|
|
95
100
|
}
|
|
96
101
|
|
|
97
102
|
export interface IMountEvent extends Event {
|
|
98
|
-
|
|
103
|
+
mountedElement: Element;
|
|
99
104
|
modules: any[];
|
|
100
105
|
mountInit: MountInit;
|
|
106
|
+
mountContext: MountContext;
|
|
101
107
|
}
|
|
102
108
|
|
|
103
109
|
export interface IDismountEvent extends Event {
|
|
104
|
-
|
|
110
|
+
mountedElement: Element;
|
|
105
111
|
reason: DismountReason;
|
|
106
112
|
mountInit: MountInit;
|
|
107
113
|
}
|