mount-observer 0.1.13 → 0.1.15

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 (43) hide show
  1. package/Events.js +9 -0
  2. package/Events.ts +12 -0
  3. package/MountObserver.js +21 -0
  4. package/MountObserver.ts +27 -0
  5. package/README.md +406 -69
  6. package/{DefineCustomElementHandler.js → handlers/DefineCustomElement.js} +103 -99
  7. package/handlers/DefineCustomElement.ts +123 -0
  8. package/handlers/EnhanceMountedElement.js +99 -0
  9. package/handlers/EnhanceMountedElement.ts +116 -0
  10. package/handlers/Events.js +110 -0
  11. package/handlers/EvtRt.js +59 -0
  12. package/handlers/GenIds.js +37 -0
  13. package/handlers/GenIds.ts +45 -0
  14. package/handlers/HTMLInclude.js +393 -0
  15. package/handlers/HTMLInclude.ts +453 -0
  16. package/handlers/HoistTemplate.js +77 -0
  17. package/handlers/HoistTemplate.ts +89 -0
  18. package/handlers/MountObserver.js +941 -0
  19. package/handlers/MountObserverScript.js +78 -0
  20. package/handlers/MountObserverScript.ts +89 -0
  21. package/handlers/ScriptExport.js +83 -0
  22. package/handlers/ScriptExport.ts +97 -0
  23. package/handlers/SharedMutationObserver.js +78 -0
  24. package/handlers/arr.js +16 -0
  25. package/handlers/connectionMonitor.js +122 -0
  26. package/handlers/elementIntersection.js +73 -0
  27. package/handlers/emitEvents.js +187 -0
  28. package/handlers/getRegistryRoot.js +52 -0
  29. package/handlers/loadImports.js +129 -0
  30. package/handlers/mediaQuery.js +90 -0
  31. package/handlers/rootSizeObserver.js +131 -0
  32. package/handlers/upShadowSearch.js +70 -0
  33. package/handlers/withScopePerimeter.js +22 -0
  34. package/index.js +2 -2
  35. package/index.ts +2 -2
  36. package/package.json +13 -3
  37. package/types/assign-gingerly/types.d.ts +244 -0
  38. package/types/be-a-beacon/types.d.ts +3 -0
  39. package/types/global.d.ts +29 -0
  40. package/types/id-generation/types.d.ts +26 -0
  41. package/types/mount-observer/types.d.ts +330 -0
  42. package/upShadowSearch.js +6 -3
  43. package/upShadowSearch.ts +6 -3
package/Events.js CHANGED
@@ -5,6 +5,7 @@ export const dismountEventName = 'dismount';
5
5
  export const disconnectEventName = 'disconnect';
6
6
  export const mediamatchEventName = 'mediamatch';
7
7
  export const mediaunmatchEventName = 'mediaunmatch';
8
+ export const resolvedEventName = 'resolved';
8
9
  export class MountEvent extends Event {
9
10
  mountedElement;
10
11
  modules;
@@ -67,3 +68,11 @@ export class MediaUnmatchEvent extends Event {
67
68
  this.mountConfig = mountConfig;
68
69
  }
69
70
  }
71
+ export class ResolvedEvent extends Event {
72
+ static eventName = resolvedEventName;
73
+ export;
74
+ constructor(exportValue) {
75
+ super(ResolvedEvent.eventName);
76
+ this.export = exportValue;
77
+ }
78
+ }
package/Events.ts CHANGED
@@ -8,6 +8,7 @@ export const dismountEventName = 'dismount';
8
8
  export const disconnectEventName = 'disconnect';
9
9
  export const mediamatchEventName = 'mediamatch';
10
10
  export const mediaunmatchEventName = 'mediaunmatch';
11
+ export const resolvedEventName = 'resolved';
11
12
 
12
13
  export class MountEvent extends Event implements IMountEvent {
13
14
  static eventName: typeof mountEventName = mountEventName;
@@ -61,3 +62,14 @@ export class MediaUnmatchEvent extends Event {
61
62
  super(MediaUnmatchEvent.eventName);
62
63
  }
63
64
  }
65
+
66
+ export class ResolvedEvent extends Event {
67
+ static eventName: typeof resolvedEventName = resolvedEventName;
68
+
69
+ export: any;
70
+
71
+ constructor(exportValue: any) {
72
+ super(ResolvedEvent.eventName);
73
+ this.export = exportValue;
74
+ }
75
+ }
package/MountObserver.js CHANGED
@@ -41,6 +41,7 @@ export class MountObserver extends EventTarget {
41
41
  #elementNotifiers = new WeakMap();
42
42
  #notifierMountedElements = new WeakSet();
43
43
  #subObservers;
44
+ #whenDefinedResolved = false;
44
45
  #mergeHandlerDefaults(config) {
45
46
  const doValue = config.do;
46
47
  // Only process if do is a string (single handler reference)
@@ -167,6 +168,24 @@ export class MountObserver extends EventTarget {
167
168
  // Update the init config with merged result
168
169
  this.#init = mergedConfig;
169
170
  }
171
+ /**
172
+ * Waits for custom elements to be defined before mounting.
173
+ * Only runs once per observer instance.
174
+ */
175
+ async #waitForWhenDefined(rootNode) {
176
+ // Skip if already resolved or not configured
177
+ if (this.#whenDefinedResolved || !this.#init.whenDefined) {
178
+ return;
179
+ }
180
+ // Get the custom element registry from the root node
181
+ const registry = rootNode.customElementRegistry || customElements;
182
+ // Normalize to array
183
+ const tagNames = arr(this.#init.whenDefined);
184
+ // Wait for all tags to be defined
185
+ await Promise.all(tagNames.map(tag => registry.whenDefined(tag)));
186
+ // Mark as resolved so we don't check again
187
+ this.#whenDefinedResolved = true;
188
+ }
170
189
  /**
171
190
  * Creates and initializes sub-observers from the `with` property.
172
191
  * Each sub-observer observes the same root node as the parent.
@@ -272,6 +291,8 @@ export class MountObserver extends EventTarget {
272
291
  this.#assignTentatively = assignTentatively;
273
292
  }
274
293
  this.#rootNode = new WeakRef(observedNode);
294
+ // Wait for whenDefined if specified (must be first check)
295
+ await this.#waitForWhenDefined(observedNode);
275
296
  // Create sub-observers from `with` property
276
297
  await this.#createSubObservers(observedNode);
277
298
  // Set up media query if specified (needs rootNode to be set first)
package/MountObserver.ts CHANGED
@@ -65,6 +65,7 @@ export class MountObserver<TKeys extends string = string> extends EventTarget im
65
65
  #elementNotifiers = new WeakMap<Element, EventTarget>();
66
66
  #notifierMountedElements = new WeakSet<Element>();
67
67
  #subObservers: Map<string, MountObserver> | undefined;
68
+ #whenDefinedResolved = false;
68
69
 
69
70
  #mergeHandlerDefaults(config: MountConfig): MountConfig {
70
71
  const doValue = config.do;
@@ -220,6 +221,29 @@ export class MountObserver<TKeys extends string = string> extends EventTarget im
220
221
  this.#init = mergedConfig;
221
222
  }
222
223
 
224
+ /**
225
+ * Waits for custom elements to be defined before mounting.
226
+ * Only runs once per observer instance.
227
+ */
228
+ async #waitForWhenDefined(rootNode: Node): Promise<void> {
229
+ // Skip if already resolved or not configured
230
+ if (this.#whenDefinedResolved || !this.#init.whenDefined) {
231
+ return;
232
+ }
233
+
234
+ // Get the custom element registry from the root node
235
+ const registry = (rootNode as any).customElementRegistry || customElements;
236
+
237
+ // Normalize to array
238
+ const tagNames = arr(this.#init.whenDefined);
239
+
240
+ // Wait for all tags to be defined
241
+ await Promise.all(tagNames.map(tag => registry.whenDefined(tag)));
242
+
243
+ // Mark as resolved so we don't check again
244
+ this.#whenDefinedResolved = true;
245
+ }
246
+
223
247
  /**
224
248
  * Creates and initializes sub-observers from the `with` property.
225
249
  * Each sub-observer observes the same root node as the parent.
@@ -379,6 +403,9 @@ export class MountObserver<TKeys extends string = string> extends EventTarget im
379
403
 
380
404
  this.#rootNode = new WeakRef(observedNode);
381
405
 
406
+ // Wait for whenDefined if specified (must be first check)
407
+ await this.#waitForWhenDefined(observedNode);
408
+
382
409
  // Create sub-observers from `with` property
383
410
  await this.#createSubObservers(observedNode);
384
411