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.
@@ -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.observe(rootNode, config);
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.observe(rootNode, config);
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/index.js');
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/index.js');
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 { mountEventName, dismountEventName, disconnectEventName, loadEventName } from './constants.js';
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 = Array.isArray(imports) ? imports : [imports];
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 = Array.isArray(imports) ? imports : [imports];
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
- observeInfo: {
52
- rootNode
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
- observeInfo: {
73
- rootNode
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.2",
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.2"
8
+ "assign-gingerly": "0.0.6"
9
9
  },
10
10
  "devDependencies": {
11
- "@playwright/test": "1.58.0",
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 | DoCallbacks;
25
+ do?: string | DoCallback | (string | DoCallback)[];
26
26
  loadingEagerness?: 'eager' | 'lazy';
27
- assignGingerly?: Record<string, any>;
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
- export interface DoCallbacks {
75
- mount?: (matchingElement: Element, context: MountContext) => void;
76
- dismount?: (matchingElement: Element, context: MountContext) => void;
77
- disconnect?: (matchingElement: Element, context: MountContext) => void;
78
- reconnect?: (matchingElement: Element, context: MountContext) => void;
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
- matchingElement: Element;
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
- matchingElement: Element;
110
+ mountedElement: Element;
105
111
  reason: DismountReason;
106
112
  mountInit: MountInit;
107
113
  }