From 37dcafdc478b62333821c08e67a919493d1f987c Mon Sep 17 00:00:00 2001 From: Cory LaViska Date: Thu, 14 Nov 2024 12:42:44 -0500 Subject: [PATCH] only run autoloader once; show warnings when imports fail --- src/utilities/autoloader.ts | 29 ++++++++++++++++++++++------- src/webawesome.loader.ts | 6 +++--- src/webawesome.ts | 2 +- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/utilities/autoloader.ts b/src/utilities/autoloader.ts index 404ca21d6..4ff6463ad 100644 --- a/src/utilities/autoloader.ts +++ b/src/utilities/autoloader.ts @@ -10,6 +10,20 @@ const observer = new MutationObserver(mutations => { } }); +/** Starts the autoloader. */ +export function startLoader() { + // Initial discovery + discover(document.body); + + // Listen for new undefined elements + observer.observe(document.documentElement, { subtree: true, childList: true }); +} + +/** Stops the autoloader */ +export function stopLoader() { + observer.disconnect(); +} + /** * Checks a node for undefined elements and attempts to register them. */ @@ -28,7 +42,14 @@ export async function discover(root: Element | ShadowRoot) { // Make the list unique const tagsToRegister = [...new Set(tags)]; - await Promise.allSettled(tagsToRegister.map(tagName => register(tagName))); + const imports = await Promise.allSettled(tagsToRegister.map(tagName => register(tagName))); + + // When an import fails, show a warning + for (const imp of imports) { + if (imp.status === 'rejected') { + console.warn(imp.reason); // eslint-disable-line no-console + } + } } /** @@ -48,9 +69,3 @@ function register(tagName: string): Promise { import(path).then(() => resolve()).catch(() => reject(new Error(`Unable to autoload <${tagName}> from ${path}`))); }); } - -// Initial discovery -discover(document.body); - -// Listen for new undefined elements -observer.observe(document.documentElement, { subtree: true, childList: true }); diff --git a/src/webawesome.loader.ts b/src/webawesome.loader.ts index 080f883f7..868636d7f 100644 --- a/src/webawesome.loader.ts +++ b/src/webawesome.loader.ts @@ -1,5 +1,5 @@ -import { discover } from './webawesome.js'; - -discover(document.body); +import { startLoader } from './webawesome.js'; export * from './webawesome.js'; + +startLoader(); diff --git a/src/webawesome.ts b/src/webawesome.ts index ecf9fb402..f574d3359 100644 --- a/src/webawesome.ts +++ b/src/webawesome.ts @@ -1,7 +1,7 @@ export { getBasePath, setBasePath, getKitCode, setKitCode } from './utilities/base-path.js'; export { registerIconLibrary, unregisterIconLibrary } from './components/icon/library.js'; export { registerTranslation } from './utilities/localize.js'; -export { discover } from './utilities/autoloader.js'; +export { discover, startLoader, stopLoader } from './utilities/autoloader.js'; // Utilities export * from './utilities/animation.js';