{"version":3,"file":"app-a1c2fb66.xxxxxxxx.bundle.js","mappings":"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","sources":["webpack://iadviser/./src/components/au2-bridge/au2-render.html","webpack://iadviser/./src/components/au2-bridge/bridge-styles.ts","webpack://iadviser/./src/components/au2-bridge/bridge-projection.ts","webpack://iadviser/./src/components/au2-bridge/bridge-api-loader.ts","webpack://iadviser/./src/components/au2-bridge/au2-render.ts"],"sourcesContent":["// Module\nvar code = \"\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n\";\n// Exports\nexport default code;","/**\r\n * Stylesheet handling for the Au2 bridge.\r\n *\r\n * Lives outside `Au2Render` so the custom element stays focused on Aurelia 1\r\n * lifecycle wiring. The caches below are module-scoped and intentionally\r\n * shared across every `` instance — bridge asset URLs are global,\r\n * so once one mount has fetched, parsed, or constructed a stylesheet, every\r\n * subsequent mount should reuse it.\r\n *\r\n * Methods that touch the DOM after an await accept a `shouldAbort` callback\r\n * so a caller that has been detached (or remounted with a new component name)\r\n * can short-circuit before the DOM mutation runs.\r\n */\r\n\r\nconst bridgeStyleLoadPromises = new Map>();\r\nconst bridgeStyleTextPromises = new Map>();\r\nconst bridgeConstructableStyleSheetPromises = new Map>();\r\nconst shadowRootStyleUrls = new WeakMap>();\r\n\r\ntype BridgeAssetUrlListener = (url: string) => void;\r\n\r\n/**\r\n * Page-wide pub/sub for `/au2/assets/...` stylesheet URLs that Vite emits as\r\n * `` tags when component chunks load. Replaces the per-mount head scan:\r\n * every shadow root subscribes once and is replayed the current backlog plus\r\n * notified of any future links. The MutationObserver covers components whose\r\n * CSS is injected after the initial mount, which the old scan-then-remove\r\n * loop could miss.\r\n */\r\nclass BridgeAssetStyleRegistry {\r\n readonly urls = new Set();\r\n private readonly listeners = new Set();\r\n private observer: MutationObserver | null = null;\r\n private observing = false;\r\n private getExcludedBaseUrl: () => string = () => '';\r\n\r\n // Caller is the bridge-style manager which knows its own base stylesheet URL;\r\n // we only want chunk styles in the registry, not the main bridge CSS the\r\n // owner loads explicitly.\r\n configureExclusion(getExcludedBaseUrl: () => string): void {\r\n this.getExcludedBaseUrl = getExcludedBaseUrl;\r\n }\r\n\r\n watch(onUrl: BridgeAssetUrlListener): () => void {\r\n this.ensureObserving();\r\n this.listeners.add(onUrl);\r\n for (const url of this.urls) {\r\n onUrl(url);\r\n }\r\n return () => {\r\n this.listeners.delete(onUrl);\r\n };\r\n }\r\n\r\n removeHeadLinksForKnownUrls(): void {\r\n if (this.urls.size === 0) {\r\n return;\r\n }\r\n\r\n const candidates = Array.from(\r\n document.head.querySelectorAll('link[rel=\"stylesheet\"]')\r\n );\r\n for (const link of candidates) {\r\n if (link.href && this.urls.has(link.href)) {\r\n link.remove();\r\n }\r\n }\r\n }\r\n\r\n private ensureObserving(): void {\r\n if (this.observing) {\r\n return;\r\n }\r\n this.observing = true;\r\n this.scanHead();\r\n\r\n if (typeof MutationObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.observer = new MutationObserver(() => this.scanHead());\r\n this.observer.observe(document.head, { childList: true });\r\n }\r\n\r\n private scanHead(): void {\r\n const links = document.head.querySelectorAll('link[rel=\"stylesheet\"]');\r\n const excludedBaseUrl = this.getExcludedBaseUrl();\r\n\r\n for (const link of Array.from(links)) {\r\n if (!link.href) {\r\n continue;\r\n }\r\n if (!link.href.includes('/au2/assets/')) {\r\n continue;\r\n }\r\n if (link.href === excludedBaseUrl) {\r\n continue;\r\n }\r\n if (this.urls.has(link.href)) {\r\n continue;\r\n }\r\n\r\n this.urls.add(link.href);\r\n this.notify(link.href);\r\n }\r\n }\r\n\r\n private notify(url: string): void {\r\n for (const listener of this.listeners) {\r\n listener(url);\r\n }\r\n }\r\n}\r\n\r\nconst bridgeAssetStyleRegistry = new BridgeAssetStyleRegistry();\r\n\r\n/**\r\n * Read-only view over the module-scope caches. Re-exported via aliases on\r\n * `Au2Render` so the existing jest spec, which reaches into the class via\r\n * `(Au2Render as any).bridgeStyleLoadPromises.clear()` between tests, keeps\r\n * resetting the same underlying Map references.\r\n */\r\nexport const bridgeStyleCaches = {\r\n loadPromises: bridgeStyleLoadPromises,\r\n textPromises: bridgeStyleTextPromises,\r\n constructableStyleSheetPromises: bridgeConstructableStyleSheetPromises,\r\n shadowRootStyleUrls,\r\n discoveredAssetStyleUrls: bridgeAssetStyleRegistry.urls,\r\n};\r\n\r\nexport interface BridgeStyleManagerOptions {\r\n getStylesUrl: () => string | undefined;\r\n getMountRoot: () => ParentNode;\r\n}\r\n\r\nexport class BridgeStyleManager {\r\n // Held so detach() can tear down the per-instance subscription when the\r\n // owning Au2Render unmounts. Without this, the registry would keep firing\r\n // applies against a dead shadow root.\r\n private unsubscribeAssetStyles: (() => void) | null = null;\r\n\r\n constructor(private readonly opts: BridgeStyleManagerOptions) {}\r\n\r\n async ensureBridgeStylesLoaded(shouldAbort: () => boolean): Promise {\r\n const stylesUrl = this.opts.getStylesUrl();\r\n if (!stylesUrl) {\r\n return;\r\n }\r\n\r\n const mountRoot = this.opts.getMountRoot();\r\n const normalizedUrl = new URL(stylesUrl, window.location.href).toString();\r\n\r\n if (mountRoot instanceof ShadowRoot) {\r\n try {\r\n await this.applyBridgeStylesheetToShadowRoot(mountRoot, normalizedUrl, shouldAbort);\r\n } catch (error) {\r\n console.warn(`[au2-render] Failed to load bridge stylesheet '${normalizedUrl}'.`, error);\r\n }\r\n return;\r\n }\r\n\r\n const existingPromise = bridgeStyleLoadPromises.get(normalizedUrl);\r\n\r\n if (existingPromise) {\r\n await existingPromise;\r\n return;\r\n }\r\n\r\n const loadPromise = loadBridgeStylesheetLink(mountRoot, normalizedUrl).catch((error) => {\r\n bridgeStyleLoadPromises.delete(normalizedUrl);\r\n throw error;\r\n });\r\n\r\n bridgeStyleLoadPromises.set(normalizedUrl, loadPromise);\r\n\r\n try {\r\n await loadPromise;\r\n } catch (error) {\r\n console.warn(`[au2-render] Failed to load bridge stylesheet '${normalizedUrl}'.`, error);\r\n }\r\n }\r\n\r\n async mirrorLoadedBridgeAssetStyles(shouldAbort: () => boolean): Promise {\r\n const mountRoot = this.opts.getMountRoot();\r\n if (!(mountRoot instanceof ShadowRoot)) {\r\n return;\r\n }\r\n\r\n bridgeAssetStyleRegistry.configureExclusion(() => {\r\n const stylesUrl = this.opts.getStylesUrl();\r\n return stylesUrl ? new URL(stylesUrl, window.location.href).toString() : '';\r\n });\r\n\r\n // Drop any previous subscription before opening a new one — guards against\r\n // a remount on the same instance leaving the old listener attached to a\r\n // stale shadow root.\r\n this.unsubscribeAssetStyles?.();\r\n\r\n const pendingApplies: Promise[] = [];\r\n this.unsubscribeAssetStyles = bridgeAssetStyleRegistry.watch((url) => {\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n\r\n pendingApplies.push(\r\n this.applyBridgeStylesheetToShadowRoot(mountRoot, url, shouldAbort).catch((error) => {\r\n console.warn(`[au2-render] Failed to mirror bridge stylesheet '${url}'.`, error);\r\n })\r\n );\r\n });\r\n\r\n await Promise.all(pendingApplies);\r\n\r\n // If we became stale mid-mirror, leave the head s in place so a\r\n // subsequent mount can discover them. Removing them on a dead mount would\r\n // orphan the styles for the next mount.\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n\r\n bridgeAssetStyleRegistry.removeHeadLinksForKnownUrls();\r\n }\r\n\r\n detach(): void {\r\n this.unsubscribeAssetStyles?.();\r\n this.unsubscribeAssetStyles = null;\r\n }\r\n\r\n private async applyBridgeStylesheetToShadowRoot(\r\n shadowRoot: ShadowRoot,\r\n url: string,\r\n shouldAbort: () => boolean\r\n ): Promise {\r\n const appliedStyleUrls = getShadowRootStyleUrls(shadowRoot);\r\n if (appliedStyleUrls.has(url)) {\r\n return;\r\n }\r\n\r\n try {\r\n const stylesheet = await getConstructableBridgeStylesheet(url);\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n if (stylesheet && canAdoptStylesheets(shadowRoot)) {\r\n const shadowRootWithStylesheets = shadowRoot as ShadowRoot & { adoptedStyleSheets: CSSStyleSheet[] };\r\n if (!shadowRootWithStylesheets.adoptedStyleSheets.includes(stylesheet)) {\r\n shadowRootWithStylesheets.adoptedStyleSheets = [\r\n ...shadowRootWithStylesheets.adoptedStyleSheets,\r\n stylesheet,\r\n ];\r\n }\r\n appliedStyleUrls.add(url);\r\n return;\r\n }\r\n\r\n const cssText = await fetchBridgeStylesheetText(url);\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n const existingStyle = Array.from(shadowRoot.querySelectorAll('style[data-au2-bridge-style=\"true\"]')).find(\r\n (candidate) => (candidate as HTMLStyleElement).dataset.au2StyleUrl === url\r\n ) as HTMLStyleElement | undefined;\r\n const style = existingStyle ?? document.createElement('style');\r\n style.textContent = cssText;\r\n style.setAttribute('data-au2-bridge-style', 'true');\r\n style.dataset.au2StyleUrl = url;\r\n\r\n if (!existingStyle) {\r\n shadowRoot.insertBefore(style, shadowRoot.firstChild);\r\n }\r\n\r\n appliedStyleUrls.add(url);\r\n } catch (error) {\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n try {\r\n await loadBridgeStylesheetLink(shadowRoot, url);\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n appliedStyleUrls.add(url);\r\n } catch {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nfunction loadBridgeStylesheetLink(targetRoot: ParentNode, url: string): Promise {\r\n const queryRoot = targetRoot instanceof ShadowRoot ? targetRoot : document.head;\r\n const appendRoot = targetRoot instanceof ShadowRoot ? targetRoot : document.head;\r\n\r\n const existingLink = Array.from(queryRoot.querySelectorAll('link[data-au2-bridge-style=\"true\"]')).find(\r\n (candidate) => (candidate as HTMLLinkElement).href === url\r\n ) as HTMLLinkElement | undefined;\r\n\r\n const link = existingLink ?? document.createElement('link');\r\n if (!existingLink) {\r\n link.rel = 'stylesheet';\r\n link.href = url;\r\n link.setAttribute('data-au2-bridge-style', 'true');\r\n }\r\n\r\n if (link.getAttribute('data-au2-loaded') === 'true' || !!link.sheet) {\r\n link.setAttribute('data-au2-loaded', 'true');\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const onLoad = (): void => {\r\n cleanup();\r\n link.setAttribute('data-au2-loaded', 'true');\r\n resolve();\r\n };\r\n\r\n const onError = (): void => {\r\n cleanup();\r\n reject(new Error(`Could not load stylesheet ${url}`));\r\n };\r\n\r\n const cleanup = (): void => {\r\n link.removeEventListener('load', onLoad);\r\n link.removeEventListener('error', onError);\r\n };\r\n\r\n link.addEventListener('load', onLoad);\r\n link.addEventListener('error', onError);\r\n\r\n if (!existingLink) {\r\n appendRoot.appendChild(link);\r\n }\r\n });\r\n}\r\n\r\nfunction getShadowRootStyleUrls(shadowRoot: ShadowRoot): Set {\r\n let urls = shadowRootStyleUrls.get(shadowRoot);\r\n if (!urls) {\r\n urls = new Set();\r\n shadowRootStyleUrls.set(shadowRoot, urls);\r\n }\r\n\r\n return urls;\r\n}\r\n\r\nfunction canAdoptStylesheets(shadowRoot: ShadowRoot): boolean {\r\n return 'adoptedStyleSheets' in shadowRoot &&\r\n typeof CSSStyleSheet !== 'undefined' &&\r\n typeof (CSSStyleSheet.prototype as CSSStyleSheet & { replace?: unknown }).replace === 'function';\r\n}\r\n\r\nfunction getConstructableBridgeStylesheet(url: string): Promise {\r\n if (typeof CSSStyleSheet === 'undefined' ||\r\n typeof (CSSStyleSheet.prototype as CSSStyleSheet & { replace?: unknown }).replace !== 'function') {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const existingPromise = bridgeConstructableStyleSheetPromises.get(url);\r\n if (existingPromise) {\r\n return existingPromise;\r\n }\r\n\r\n const promise = fetchBridgeStylesheetText(url)\r\n .then(async (cssText) => {\r\n const stylesheet = new CSSStyleSheet();\r\n await (stylesheet as CSSStyleSheet & {\r\n replace: (text: string) => Promise;\r\n }).replace(cssText);\r\n return stylesheet;\r\n })\r\n .catch((error) => {\r\n bridgeConstructableStyleSheetPromises.delete(url);\r\n throw error;\r\n });\r\n\r\n bridgeConstructableStyleSheetPromises.set(url, promise);\r\n return promise;\r\n}\r\n\r\nfunction fetchBridgeStylesheetText(url: string): Promise {\r\n const existingPromise = bridgeStyleTextPromises.get(url);\r\n if (existingPromise) {\r\n return existingPromise;\r\n }\r\n\r\n const promise = fetch(url, { credentials: 'same-origin' })\r\n .then(async (response) => {\r\n if (!response.ok) {\r\n throw new Error(`Could not fetch stylesheet ${url}: ${response.status}`);\r\n }\r\n\r\n return rebaseRelativeCssUrls(await response.text(), url);\r\n })\r\n .catch((error) => {\r\n bridgeStyleTextPromises.delete(url);\r\n throw error;\r\n });\r\n\r\n bridgeStyleTextPromises.set(url, promise);\r\n return promise;\r\n}\r\n\r\nfunction rebaseRelativeCssUrls(cssText: string, stylesheetUrl: string): string {\r\n return cssText.replace(\r\n /url\\(\\s*(['\"]?)(?!data:|https?:|\\/\\/|#|\\/)([^'\")]+)\\1\\s*\\)/gi,\r\n (_match, _quote, relativeUrl: string) => {\r\n const absoluteUrl = new URL(relativeUrl.trim(), stylesheetUrl).toString();\r\n return `url(\"${absoluteUrl}\")`;\r\n }\r\n );\r\n}\r\n","/**\r\n * Projection handling for the Au2 bridge.\r\n *\r\n * Aurelia 2 components rendered through `` typically live inside a\r\n * shadow root, so the Aurelia 1 wrapper's child nodes need to be moved into\r\n * matching `data-au2-projection-target` elements after enhance resolves. The\r\n * `ProjectionManager` tracks the original DOM home of every projected node so\r\n * detach can restore the wrapper to its pre-mount shape — this is what lets\r\n * Aurelia 1 keep ownership of the host element while Aurelia 2 owns whatever\r\n * is inside the bridge container.\r\n */\r\n\r\ninterface ProjectionHome {\r\n parent: Node;\r\n nextSibling: Node | null;\r\n}\r\n\r\nexport interface ProjectionManagerOptions {\r\n hostElement: HTMLElement;\r\n // Resolved lazily — the projection manager outlives any single mount and the\r\n // container can be created and torn down repeatedly.\r\n getContainer: () => HTMLElement | null;\r\n // The Au1 template binds its hidden `` wrapper to the owner via\r\n // `ref=\"projectionContainer\"`, so the owner is the source of truth for that\r\n // element. The manager defers to it through these callbacks and only falls\r\n // back to creating one when the template-bound wrapper is missing.\r\n getProjectionContainer: () => HTMLDivElement | null;\r\n setProjectionContainer: (container: HTMLDivElement | null) => void;\r\n getComponentName: () => string;\r\n}\r\n\r\nexport class ProjectionManager {\r\n private projectedNodeHomes = new WeakMap();\r\n\r\n constructor(private readonly opts: ProjectionManagerOptions) {}\r\n\r\n getProjectedNodes(): Node[] {\r\n this.parkProjectedNodes();\r\n const projectionSource = this.opts.getProjectionContainer() ?? this.opts.hostElement;\r\n if (!projectionSource) {\r\n return [];\r\n }\r\n\r\n return Array.from(projectionSource.childNodes).filter((node) => isProjectableNode(node));\r\n }\r\n\r\n projectProjectedNodes(nodes: Node[]): void {\r\n const container = this.opts.getContainer();\r\n if (!container || nodes.length === 0) {\r\n return;\r\n }\r\n\r\n const slottedNodes = new Map();\r\n\r\n for (const node of nodes) {\r\n if (node.nodeType === Node.ELEMENT_NODE && (node as HTMLElement).hasAttribute('data-au2-slot')) {\r\n const slotWrapper = node as HTMLElement;\r\n const slotName = slotWrapper.getAttribute('data-au2-slot') || 'default';\r\n const slotNodes = Array.from(slotWrapper.childNodes).filter((childNode) => isProjectableNode(childNode));\r\n\r\n if (slotNodes.length === 0) {\r\n continue;\r\n }\r\n\r\n const bucket = slottedNodes.get(slotName) ?? [];\r\n for (const slotNode of slotNodes) {\r\n this.rememberProjectionHome(slotNode);\r\n }\r\n bucket.push(...slotNodes);\r\n slottedNodes.set(slotName, bucket);\r\n continue;\r\n }\r\n\r\n const bucket = slottedNodes.get('default') ?? [];\r\n this.rememberProjectionHome(node);\r\n bucket.push(node);\r\n slottedNodes.set('default', bucket);\r\n }\r\n\r\n for (const [slotName, slotNodes] of slottedNodes.entries()) {\r\n const target = this.findProjectionTarget(container, slotName);\r\n if (!target) {\r\n const slotLabel = slotName === 'default' ? 'default slot' : `slot '${slotName}'`;\r\n console.error(\r\n `[au2-render] Projection target for ${slotLabel} not found for component '${this.opts.getComponentName()}'. ` +\r\n 'Ensure the Au2 template defines data-au2-projection-target for every projected slot.'\r\n );\r\n continue;\r\n }\r\n\r\n for (const node of slotNodes) {\r\n target.appendChild(node);\r\n }\r\n }\r\n }\r\n\r\n restoreProjectedNodes(): void {\r\n const container = this.opts.getContainer();\r\n if (!container) {\r\n return;\r\n }\r\n\r\n const projectionContainer = this.opts.getProjectionContainer();\r\n for (const target of Array.from(container.querySelectorAll('[data-au2-projection-target]'))) {\r\n const nodes = Array.from(target.childNodes).filter((node) => isProjectableNode(node));\r\n for (const node of nodes) {\r\n const home = this.projectedNodeHomes.get(node) ?? {\r\n parent: projectionContainer ?? this.opts.hostElement,\r\n nextSibling: null,\r\n };\r\n const nextSibling = home.nextSibling && home.nextSibling.parentNode === home.parent\r\n ? home.nextSibling\r\n : null;\r\n home.parent.insertBefore(node, nextSibling);\r\n }\r\n }\r\n }\r\n\r\n private parkProjectedNodes(): void {\r\n const hostElement = this.opts.hostElement;\r\n let projectionContainer = this.opts.getProjectionContainer();\r\n const projectableNodes = Array.from(hostElement.childNodes).filter((node) => {\r\n return node !== projectionContainer && isProjectableNode(node);\r\n });\r\n\r\n if (!projectionContainer && projectableNodes.length > 0) {\r\n projectionContainer = document.createElement('div');\r\n projectionContainer.hidden = true;\r\n projectionContainer.setAttribute('data-au2-projection-source', 'true');\r\n hostElement.appendChild(projectionContainer);\r\n this.opts.setProjectionContainer(projectionContainer);\r\n }\r\n\r\n if (!projectionContainer) {\r\n return;\r\n }\r\n\r\n for (const node of projectableNodes) {\r\n projectionContainer.appendChild(node);\r\n }\r\n }\r\n\r\n private findProjectionTarget(container: HTMLElement, slotName: string): Element | null {\r\n if (slotName !== 'default') {\r\n return container.querySelector(`[data-au2-projection-target=\"${slotName}\"]`);\r\n }\r\n\r\n return (\r\n container.querySelector('[data-au2-projection-target=\"default\"]') ??\r\n Array.from(container.querySelectorAll('[data-au2-projection-target]')).find((candidate) => {\r\n const targetName = candidate.getAttribute('data-au2-projection-target');\r\n return targetName === '' || targetName === 'default' || targetName === null;\r\n }) ??\r\n null\r\n );\r\n }\r\n\r\n private rememberProjectionHome(node: Node): void {\r\n if (this.projectedNodeHomes.has(node)) {\r\n return;\r\n }\r\n\r\n this.projectedNodeHomes.set(node, {\r\n parent: node.parentNode ?? this.opts.getProjectionContainer() ?? this.opts.hostElement,\r\n nextSibling: node.nextSibling,\r\n });\r\n }\r\n}\r\n\r\nfunction isProjectableNode(node: Node): boolean {\r\n if (node.nodeType === Node.COMMENT_NODE) {\r\n return false;\r\n }\r\n\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n return (node.textContent?.trim().length ?? 0) > 0;\r\n }\r\n\r\n return true;\r\n}\r\n","/**\r\n * Bridge script loader and Au2 API ready-state coordination.\r\n *\r\n * Two responsibilities split across this module:\r\n *\r\n * 1. **One-shot script load** — `/au2/index.js` is fetched exactly once per\r\n * page, no matter how many `` instances exist. The promise\r\n * lives in a module-scope holder so multiple instances share it.\r\n * 2. **Per-instance ready-wait** — `BridgeApiWaiter` owns the timeout, the\r\n * `au2-ready` listener, and the resolver so a single host's detach can\r\n * tear those down without affecting other live waiters.\r\n *\r\n * The script-load holder is reachable from `Au2Render.bridgeScriptLoadPromise`\r\n * via static accessors so the existing jest spec, which clears it via\r\n * `(Au2Render as any).bridgeScriptLoadPromise = null` between tests, still\r\n * resets the same underlying cell that `loadBridgeScript` reads.\r\n */\r\n\r\nconst READY_EVENT_NAME = 'au2-ready';\r\nconst READY_TIMEOUT_MS = 15000;\r\nconst BRIDGE_UNAVAILABLE_EVENT_NAME = 'au2-bridge-unavailable';\r\n// Two retries after the first attempt covers the common case of a transient\r\n// CDN/network blip without pushing total time past the ready-wait budget.\r\nconst BRIDGE_SCRIPT_RETRY_DELAYS_MS = [500, 1500] as const;\r\n\r\n/**\r\n * Result from enhancing a DOM element with an Au2 component.\r\n */\r\nexport interface EnhanceResult {\r\n aurelia: any;\r\n context: Record;\r\n dispose: () => void;\r\n updateProp: (key: string, value: unknown) => void;\r\n updateProps: (props: Record) => void;\r\n}\r\n\r\n/**\r\n * Global Au2 API contract (set by iadviser-v2/src/enhance.ts).\r\n */\r\nexport interface Au2EnhanceAPI {\r\n enhance: (\r\n host: HTMLElement,\r\n componentName: string,\r\n data: Record\r\n ) => Promise;\r\n hasComponent: (name: string) => boolean;\r\n getComponentNames: () => string[];\r\n getComponentMetadata?: (name: string) => Promise>;\r\n stylesUrl?: string;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n au2?: Au2EnhanceAPI;\r\n __au2BridgeEnabled?: boolean;\r\n __au2BridgeScriptUrl?: string;\r\n }\r\n}\r\n\r\nexport const bridgeScriptState = {\r\n loadPromise: null as Promise | null,\r\n};\r\n\r\nexport function isAu2ApiReady(api: Au2EnhanceAPI | undefined): api is Au2EnhanceAPI {\r\n return !!api &&\r\n typeof api.enhance === 'function' &&\r\n typeof api.hasComponent === 'function' &&\r\n typeof api.getComponentNames === 'function';\r\n}\r\n\r\nexport function loadBridgeScript(): Promise {\r\n if (bridgeScriptState.loadPromise) {\r\n return bridgeScriptState.loadPromise;\r\n }\r\n\r\n bridgeScriptState.loadPromise = attemptLoadBridgeScript(0).catch((error) => {\r\n // Drop the cached failure so a future call (e.g., user navigating, or a\r\n // host page choosing to retry after surfacing the unavailable event) can\r\n // restart the load chain from scratch.\r\n bridgeScriptState.loadPromise = null;\r\n dispatchBridgeUnavailable(error);\r\n throw error;\r\n });\r\n\r\n return bridgeScriptState.loadPromise;\r\n}\r\n\r\nasync function attemptLoadBridgeScript(attempt: number): Promise {\r\n try {\r\n await loadBridgeScriptOnce();\r\n } catch (error) {\r\n if (attempt >= BRIDGE_SCRIPT_RETRY_DELAYS_MS.length) {\r\n throw error;\r\n }\r\n\r\n const delay = BRIDGE_SCRIPT_RETRY_DELAYS_MS[attempt];\r\n console.warn(\r\n `[au2-render] Bridge script load failed (attempt ${attempt + 1} of ${BRIDGE_SCRIPT_RETRY_DELAYS_MS.length + 1}); retrying in ${delay}ms.`,\r\n error\r\n );\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n return attemptLoadBridgeScript(attempt + 1);\r\n }\r\n}\r\n\r\nfunction loadBridgeScriptOnce(): Promise {\r\n const scriptUrl = window.__au2BridgeScriptUrl ?? '/au2/index.js';\r\n let existingScript = document.querySelector(\r\n 'script[data-au2-bridge-script=\"true\"]'\r\n );\r\n\r\n if (existingScript?.getAttribute('data-au2-loaded') === 'true') {\r\n return Promise.resolve();\r\n }\r\n\r\n // A leftover script from a previous failed attempt can't recover via re-load\r\n // event — the browser already finished resolving it. Drop it so the retry\r\n // gets a fresh fetch.\r\n if (existingScript?.getAttribute('data-au2-failed') === 'true') {\r\n existingScript.remove();\r\n existingScript = null;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const script = existingScript ?? document.createElement('script');\r\n const cleanup = (): void => {\r\n script.removeEventListener('load', onLoad);\r\n script.removeEventListener('error', onError);\r\n };\r\n const onLoad = (): void => {\r\n cleanup();\r\n script.setAttribute('data-au2-loaded', 'true');\r\n resolve();\r\n };\r\n const onError = (): void => {\r\n cleanup();\r\n script.setAttribute('data-au2-failed', 'true');\r\n reject(new Error(`Could not load Au2 bridge script ${scriptUrl}`));\r\n };\r\n\r\n script.addEventListener('load', onLoad);\r\n script.addEventListener('error', onError);\r\n\r\n if (!existingScript) {\r\n script.type = 'module';\r\n script.src = scriptUrl;\r\n script.setAttribute('data-au2-bridge-script', 'true');\r\n document.head.appendChild(script);\r\n }\r\n });\r\n}\r\n\r\nfunction dispatchBridgeUnavailable(error: unknown): void {\r\n try {\r\n window.dispatchEvent(\r\n new CustomEvent(BRIDGE_UNAVAILABLE_EVENT_NAME, {\r\n bubbles: false,\r\n cancelable: false,\r\n detail: { error },\r\n })\r\n );\r\n } catch (dispatchError) {\r\n console.warn('[au2-render] Failed to dispatch au2-bridge-unavailable event:', dispatchError);\r\n }\r\n}\r\n\r\nexport interface BridgeApiWaiterOptions {\r\n // Returns true when the owner has been detached — used so a long-running\r\n // wait resolves to null instead of leaking a pending listener/timeout past\r\n // the owner's lifetime.\r\n isOwnerDestroyed: () => boolean;\r\n}\r\n\r\nexport class BridgeApiWaiter {\r\n private readyPromise: Promise | null = null;\r\n private readyResolver: ((api: Au2EnhanceAPI | null) => void) | null = null;\r\n private readyEventHandler: (() => void) | null = null;\r\n private readyTimeoutId: number | null = null;\r\n\r\n constructor(private readonly opts: BridgeApiWaiterOptions) {}\r\n\r\n /**\r\n * Resolves with the Au2 bridge API if it becomes ready before the timeout,\r\n * or `null` if the bridge is disabled or the owner is detached. Reuses any\r\n * pending wait so concurrent calls share the same listener.\r\n */\r\n ensureReady(): Promise {\r\n if (isAu2ApiReady(window.au2)) {\r\n return Promise.resolve(window.au2);\r\n }\r\n\r\n if (window.__au2BridgeEnabled === false) {\r\n console.error('[au2-render] Au2 bridge support is disabled for this page.');\r\n return Promise.resolve(null);\r\n }\r\n\r\n return this.waitForApi();\r\n }\r\n\r\n /**\r\n * Aborts any in-flight wait and resolves outstanding callers with null.\r\n * Called when the owner detaches.\r\n */\r\n cancel(): void {\r\n this.finalize(null);\r\n }\r\n\r\n private waitForApi(): Promise {\r\n if (isAu2ApiReady(window.au2)) {\r\n return Promise.resolve(window.au2);\r\n }\r\n\r\n if (this.readyPromise) {\r\n return this.readyPromise;\r\n }\r\n\r\n this.readyPromise = new Promise((resolve) => {\r\n this.readyResolver = resolve;\r\n\r\n const resolveIfReady = (): void => {\r\n if (this.opts.isOwnerDestroyed()) {\r\n this.finalize(null);\r\n return;\r\n }\r\n\r\n if (isAu2ApiReady(window.au2)) {\r\n this.finalize(window.au2);\r\n }\r\n };\r\n\r\n this.readyEventHandler = () => {\r\n resolveIfReady();\r\n };\r\n\r\n window.addEventListener(READY_EVENT_NAME, this.readyEventHandler);\r\n\r\n this.readyTimeoutId = window.setTimeout(() => {\r\n console.error('[au2-render] Timed out waiting for Au2 bridge API.');\r\n this.finalize(null);\r\n }, READY_TIMEOUT_MS);\r\n\r\n // Re-check after the script load resolves: the bridge body runs (and\r\n // dispatches au2-ready) before the script's load event fires, so if we\r\n // attached our listener after that point we'd miss the event entirely.\r\n loadBridgeScript()\r\n .then(resolveIfReady)\r\n .catch((error) => {\r\n console.error('[au2-render] Failed to load Au2 bridge bundle:', error);\r\n this.finalize(null);\r\n });\r\n\r\n // Catch the case where the API became ready between the outer ready\r\n // check and our listener attaching above.\r\n resolveIfReady();\r\n });\r\n\r\n return this.readyPromise;\r\n }\r\n\r\n private finalize(api: Au2EnhanceAPI | null): void {\r\n const resolver = this.readyResolver;\r\n this.readyResolver = null;\r\n this.clearWaiters();\r\n this.readyPromise = null;\r\n\r\n if (resolver) {\r\n resolver(api);\r\n }\r\n }\r\n\r\n private clearWaiters(): void {\r\n if (this.readyEventHandler) {\r\n window.removeEventListener(READY_EVENT_NAME, this.readyEventHandler);\r\n this.readyEventHandler = null;\r\n }\r\n\r\n if (this.readyTimeoutId !== null) {\r\n window.clearTimeout(this.readyTimeoutId);\r\n this.readyTimeoutId = null;\r\n }\r\n }\r\n}\r\n","import { customElement, bindable, bindingMode, TaskQueue, DOM } from 'aurelia-framework';\r\nimport { BridgeStyleManager, bridgeStyleCaches } from './bridge-styles';\r\nimport { ProjectionManager } from './bridge-projection';\r\nimport { BridgeApiWaiter, bridgeScriptState, isAu2ApiReady, type EnhanceResult } from './bridge-api-loader';\r\n\r\n/**\r\n * Bridge component that renders Aurelia 2 components inside Aurelia 1.\r\n *\r\n * The Au2 bundle must be loaded before this component is used. The bundle\r\n * sets up `window.au2.enhance()` which this component calls to mount Au2\r\n * components.\r\n *\r\n * @example\r\n * \r\n * \r\n */\r\n@customElement('au2-render')\r\nexport class Au2Render {\r\n static inject = [Element, TaskQueue];\r\n // Aliases preserved so the existing jest spec — which clears caches via\r\n // `(Au2Render as any).bridgeStyleLoadPromises.clear()` and assigns\r\n // `(Au2Render as any).bridgeScriptLoadPromise = null` between tests — keeps\r\n // resetting the same underlying state that the helper modules use.\r\n private static readonly bridgeStyleLoadPromises = bridgeStyleCaches.loadPromises;\r\n private static readonly bridgeStyleTextPromises = bridgeStyleCaches.textPromises;\r\n private static readonly bridgeConstructableStyleSheetPromises = bridgeStyleCaches.constructableStyleSheetPromises;\r\n private static readonly discoveredBridgeAssetStyleUrls = bridgeStyleCaches.discoveredAssetStyleUrls;\r\n private static get bridgeScriptLoadPromise(): Promise | null { return bridgeScriptState.loadPromise; }\r\n private static set bridgeScriptLoadPromise(value: Promise | null) { bridgeScriptState.loadPromise = value; }\r\n\r\n @bindable componentName: string = '';\r\n @bindable({ defaultBindingMode: bindingMode.twoWay }) props: Record = {};\r\n @bindable containerClass: string = '';\r\n\r\n private container: HTMLDivElement | null = null;\r\n // Bound by the Au1 view via `ref=\"projectionContainer\"` so this view-model\r\n // field is the source of truth for the hidden `` wrapper that Au1\r\n // distributes the host's children into. ProjectionManager reads/writes this\r\n // through opts callbacks instead of owning its own copy.\r\n private projectionContainer: HTMLDivElement | null = null;\r\n private enhanceResult: EnhanceResult | null = null;\r\n private isDestroyed = false;\r\n private hasAttached = false;\r\n private mountGeneration = 0;\r\n private boundEventHandler: ((event: Event) => void) | null = null;\r\n private mountRoot: ParentNode | null = null;\r\n private pendingProps: Record | null = null;\r\n private lastSyncedProps: Record | null = null;\r\n private readonly bridgeStyles: BridgeStyleManager;\r\n private readonly projection: ProjectionManager;\r\n private readonly apiWaiter: BridgeApiWaiter;\r\n\r\n constructor(\r\n private element: Element,\r\n private taskQueue: TaskQueue\r\n ) {\r\n this.bridgeStyles = new BridgeStyleManager({\r\n getStylesUrl: () => window.au2?.stylesUrl,\r\n getMountRoot: () => this.getMountRoot(),\r\n });\r\n this.projection = new ProjectionManager({\r\n hostElement: this.element as HTMLElement,\r\n getContainer: () => this.container,\r\n getProjectionContainer: () => this.projectionContainer,\r\n setProjectionContainer: (container) => { this.projectionContainer = container; },\r\n getComponentName: () => this.componentName,\r\n });\r\n this.apiWaiter = new BridgeApiWaiter({\r\n isOwnerDestroyed: () => this.isDestroyed,\r\n });\r\n }\r\n\r\n async attached(): Promise {\r\n this.isDestroyed = false;\r\n this.hasAttached = true;\r\n\r\n if (!this.componentName) {\r\n console.warn('[au2-render] No component-name specified');\r\n return;\r\n }\r\n\r\n await this.mountWhenReady();\r\n }\r\n\r\n detached(): void {\r\n this.isDestroyed = true;\r\n this.hasAttached = false;\r\n this.apiWaiter.cancel();\r\n this.cleanup();\r\n }\r\n\r\n componentNameChanged(newValue: string, oldValue: string): void {\r\n if (!newValue || this.isDestroyed || !this.hasAttached) {\r\n return;\r\n }\r\n\r\n if (!oldValue && (this.enhanceResult || this.container)) {\r\n return;\r\n }\r\n\r\n if (newValue !== oldValue) {\r\n this.cleanup();\r\n this.taskQueue.queueMicroTask(() => {\r\n void this.mountWhenReady();\r\n });\r\n }\r\n }\r\n\r\n propsChanged(newProps: Record, _oldProps: Record): void {\r\n if (this.isDestroyed) {\r\n return;\r\n }\r\n\r\n if (this.enhanceResult) {\r\n this.syncPropsToAu2(newProps);\r\n return;\r\n }\r\n\r\n this.pendingProps = this.snapshotProps(newProps);\r\n }\r\n\r\n containerClassChanged(newValue: string): void {\r\n if (this.container) {\r\n this.container.className = newValue || '';\r\n }\r\n }\r\n\r\n /**\r\n * Force-sync current props to the Au2 component.\r\n * Use this after mutating arrays or nested objects where the reference\r\n * hasn't changed and propsChanged won't fire automatically.\r\n */\r\n forceSync(): void {\r\n const props = this.snapshotProps(this.props);\r\n\r\n if (this.enhanceResult) {\r\n this.enhanceResult.updateProps(props);\r\n this.lastSyncedProps = props;\r\n return;\r\n }\r\n\r\n this.pendingProps = props;\r\n }\r\n\r\n private async mountWhenReady(): Promise {\r\n if (this.isDestroyed || !this.componentName) {\r\n return;\r\n }\r\n\r\n // Capture generation at the start so any later detach/remount or\r\n // componentName flip invalidates every async step below in one place,\r\n // rather than having each helper bump its own counter.\r\n const generation = ++this.mountGeneration;\r\n\r\n const api = await this.apiWaiter.ensureReady();\r\n if (!api || this.isStale(generation) || !this.componentName) {\r\n return;\r\n }\r\n\r\n this.getMountRoot();\r\n await this.bridgeStyles.ensureBridgeStylesLoaded(() => this.isStale(generation));\r\n if (this.isStale(generation)) {\r\n return;\r\n }\r\n\r\n await this.mountAu2Component(generation);\r\n }\r\n\r\n private async mountAu2Component(generation: number): Promise {\r\n if (this.isStale(generation) || !isAu2ApiReady(window.au2)) return;\r\n const au2 = window.au2;\r\n const initialProps = this.snapshotProps(this.props);\r\n\r\n try {\r\n if (!au2.hasComponent(this.componentName)) {\r\n console.error(\r\n `[au2-render] Component '${this.componentName}' not found. ` +\r\n `Available: ${au2.getComponentNames().join(', ')}`\r\n );\r\n return;\r\n }\r\n\r\n this.createContainer();\r\n const projectedNodes = this.projection.getProjectedNodes();\r\n this.setupEventListener();\r\n this.dispatchBridgeEvent('au2-mount-start', {\r\n componentName: this.componentName,\r\n });\r\n\r\n // Use the global Au2 API to enhance\r\n const enhanceResult = await au2.enhance(\r\n this.container!,\r\n this.componentName,\r\n initialProps\r\n );\r\n\r\n if (this.isStale(generation) || !this.container) {\r\n try {\r\n enhanceResult.dispose();\r\n } catch (error) {\r\n console.warn('[au2-render] Error disposing stale Au2 app:', error);\r\n }\r\n return;\r\n }\r\n\r\n this.enhanceResult = enhanceResult;\r\n this.lastSyncedProps = initialProps;\r\n this.syncPropsToAu2(this.pendingProps ?? this.snapshotProps(this.props));\r\n this.pendingProps = null;\r\n await this.bridgeStyles.mirrorLoadedBridgeAssetStyles(() => this.isStale(generation));\r\n // mirrorLoadedBridgeAssetStyles awaits; if a detach happened during\r\n // that await, cleanup() has already disposed enhanceResult and removed\r\n // the container. Bail before projecting or dispatching au2-mounted on\r\n // a dead host.\r\n if (this.isStale(generation)) {\r\n return;\r\n }\r\n this.projection.projectProjectedNodes(projectedNodes);\r\n this.taskQueue.queueTask(() => {\r\n if (this.isStale(generation)) {\r\n return;\r\n }\r\n\r\n this.projection.projectProjectedNodes(this.projection.getProjectedNodes());\r\n });\r\n this.dispatchBridgeEvent('au2-mounted', {\r\n componentName: this.componentName,\r\n container: this.container,\r\n });\r\n } catch (error) {\r\n console.error('[au2-render] Failed to mount component:', error);\r\n this.dispatchBridgeEvent('au2-mount-error', {\r\n componentName: this.componentName,\r\n error,\r\n });\r\n if (!this.isStale(generation)) {\r\n this.cleanup();\r\n }\r\n }\r\n }\r\n\r\n private isStale(generation: number): boolean {\r\n return this.isDestroyed || generation !== this.mountGeneration;\r\n }\r\n\r\n private createContainer(): void {\r\n if (this.container) return;\r\n\r\n const mountRoot = this.getMountRoot();\r\n this.container = document.createElement('div');\r\n this.container.setAttribute('data-au2-bridge', 'true');\r\n this.container.setAttribute('data-au2-component', this.componentName);\r\n\r\n if (this.containerClass) {\r\n this.container.className = this.containerClass;\r\n }\r\n\r\n mountRoot.appendChild(this.container);\r\n }\r\n\r\n private syncPropsToAu2(newProps: Record): void {\r\n if (!this.enhanceResult) return;\r\n\r\n // Diff against the last known snapshot we sent to Au2, not against the\r\n // oldProps argument from Aurelia's change handler — the Au2-to-Au1 event\r\n // handler mutates this.props in place, so by the time propsChanged fires\r\n // oldProps already reflects the new value.\r\n const snapshot = this.snapshotProps(newProps);\r\n const baseline = this.lastSyncedProps ?? {};\r\n const changed: Record = {};\r\n let hasChanges = false;\r\n\r\n for (const key of Object.keys(snapshot)) {\r\n if (!Object.is(baseline[key], snapshot[key])) {\r\n changed[key] = snapshot[key];\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n if (!hasChanges) return;\r\n\r\n this.enhanceResult.updateProps(changed);\r\n this.lastSyncedProps = snapshot;\r\n }\r\n\r\n private snapshotProps(props: Record | null | undefined): Record {\r\n if (!props || typeof props !== 'object') {\r\n return {};\r\n }\r\n\r\n return { ...props };\r\n }\r\n\r\n private dispatchBridgeEvent(name: string, detail: Record): void {\r\n const event = DOM.createCustomEvent(name, {\r\n bubbles: true,\r\n cancelable: true,\r\n detail,\r\n });\r\n this.element.dispatchEvent(event);\r\n }\r\n\r\n private setupEventListener(): void {\r\n if (!this.container) return;\r\n\r\n // Defensive: if a prior mount on this instance already bound a handler\r\n // and cleanup hasn't run, detach it before binding a new one so we never\r\n // leak duplicate listeners on the same container.\r\n if (this.boundEventHandler) {\r\n this.container.removeEventListener('au2-prop-change', this.boundEventHandler);\r\n this.boundEventHandler = null;\r\n }\r\n\r\n this.boundEventHandler = (event: Event) => {\r\n if (!this.props || typeof this.props !== 'object') {\r\n this.props = {};\r\n }\r\n\r\n const customEvent = event as CustomEvent;\r\n const { property, value } = customEvent.detail || {};\r\n\r\n if (property && Object.prototype.hasOwnProperty.call(this.props, property)) {\r\n this.props[property] = value;\r\n // Keep the sync baseline aligned so the wrapper writing the same\r\n // value back to its bindable doesn't bounce it back to Au2.\r\n if (this.lastSyncedProps) {\r\n this.lastSyncedProps[property] = value;\r\n }\r\n\r\n const changeEvent = DOM.createCustomEvent('props-changed', {\r\n bubbles: true,\r\n cancelable: true,\r\n detail: { property, value },\r\n });\r\n this.element.dispatchEvent(changeEvent);\r\n }\r\n };\r\n\r\n this.container.addEventListener('au2-prop-change', this.boundEventHandler);\r\n }\r\n\r\n private cleanup(): void {\r\n this.mountGeneration++;\r\n this.bridgeStyles.detach();\r\n this.projection.restoreProjectedNodes();\r\n\r\n if (this.container && this.boundEventHandler) {\r\n this.container.removeEventListener('au2-prop-change', this.boundEventHandler);\r\n this.boundEventHandler = null;\r\n }\r\n\r\n if (this.enhanceResult) {\r\n try {\r\n this.enhanceResult.dispose();\r\n } catch (error) {\r\n console.warn('[au2-render] Error disposing Au2 app:', error);\r\n }\r\n this.enhanceResult = null;\r\n }\r\n\r\n if (this.container && this.container.parentNode) {\r\n this.container.parentNode.removeChild(this.container);\r\n this.container = null;\r\n }\r\n\r\n this.pendingProps = null;\r\n this.lastSyncedProps = null;\r\n this.dispatchBridgeEvent('au2-disposed', {\r\n componentName: this.componentName,\r\n });\r\n }\r\n\r\n private getMountRoot(): ParentNode {\r\n if (this.mountRoot) {\r\n return this.mountRoot;\r\n }\r\n\r\n const hostElement = this.element as HTMLElement;\r\n\r\n if (hostElement && typeof hostElement.attachShadow === 'function') {\r\n this.mountRoot = hostElement.shadowRoot ?? hostElement.attachShadow({ mode: 'open' });\r\n return this.mountRoot;\r\n }\r\n\r\n this.mountRoot = this.element as unknown as ParentNode;\r\n return this.mountRoot;\r\n }\r\n\r\n}\r\n"],"names":["__webpack_exports__","bridgeStyleLoadPromises","Map","bridgeStyleTextPromises","bridgeConstructableStyleSheetPromises","shadowRootStyleUrls","WeakMap","bridgeAssetStyleRegistry","BridgeAssetStyleRegistry","this","urls","Set","listeners","observer","observing","getExcludedBaseUrl","prototype","configureExclusion","watch","onUrl","_this","ensureObserving","add","_b","__values","_c","next","done","url","value","delete","removeHeadLinksForKnownUrls","size","candidates","Array","from","document","head","querySelectorAll","candidates_1","candidates_1_1","link","href","has","remove","scanHead","MutationObserver","observe","childList","links","excludedBaseUrl","includes","notify","listener","bridgeStyleCaches","loadPromises","textPromises","constructableStyleSheetPromises","discoveredAssetStyleUrls","BridgeStyleManager","opts","unsubscribeAssetStyles","ensureBridgeStylesLoaded","shouldAbort","Promise","stylesUrl","getStylesUrl","mountRoot","getMountRoot","normalizedUrl","URL","window","location","toString","ShadowRoot","applyBridgeStylesheetToShadowRoot","_a","sent","console","warn","concat","error_1","existingPromise","get","loadPromise","loadBridgeStylesheetLink","catch","error","set","error_2","mirrorLoadedBridgeAssetStyles","call","pendingApplies","push","all","detach","shadowRoot","appliedStyleUrls","getShadowRootStyleUrls","getConstructableBridgeStylesheet","stylesheet","CSSStyleSheet","replace","canAdoptStylesheets","shadowRootWithStylesheets","adoptedStyleSheets","__spreadArray","__read","fetchBridgeStylesheetText","cssText","existingStyle","find","candidate","dataset","au2StyleUrl","style","createElement","textContent","setAttribute","insertBefore","firstChild","error_3","targetRoot","queryRoot","appendRoot","existingLink","rel","getAttribute","sheet","resolve","reject","onLoad","cleanup","onError","Error","removeEventListener","addEventListener","appendChild","promise","then","__awaiter","fetch","credentials","response","ok","status","rebaseRelativeCssUrls","text","apply","stylesheetUrl","_match","_quote","relativeUrl","absoluteUrl","trim","ProjectionManager","projectedNodeHomes","getProjectedNodes","parkProjectedNodes","projectionSource","getProjectionContainer","hostElement","childNodes","filter","node","isProjectableNode","projectProjectedNodes","nodes","container","getContainer","length","slottedNodes","nodes_1","bridge_projection_values","nodes_1_1","nodeType","Node","ELEMENT_NODE","hasAttribute","slotWrapper","slotName","slotNodes","childNode","bucket_1","_e","slotNodes_1","e_2","slotNodes_1_1","slotNode","rememberProjectionHome","bridge_projection_spreadArray","bridge_projection_read","bucket","_f","_g","entries","_h","_j","target","findProjectionTarget","slotNodes_2","e_4","slotNodes_2_1","slotLabel","getComponentName","restoreProjectedNodes","projectionContainer","_d","nodes_2","e_6","nodes_2_1","home","parent","nextSibling","parentNode","projectableNodes","hidden","setProjectionContainer","projectableNodes_1","projectableNodes_1_1","querySelector","targetName","COMMENT_NODE","TEXT_NODE","READY_EVENT_NAME","BRIDGE_SCRIPT_RETRY_DELAYS_MS","bridgeScriptState","isAu2ApiReady","api","enhance","hasComponent","getComponentNames","loadBridgeScript","attemptLoadBridgeScript","dispatchEvent","CustomEvent","bubbles","cancelable","detail","dispatchError","dispatchBridgeUnavailable","attempt","loadBridgeScriptOnce","delay_1","setTimeout","scriptUrl","__au2BridgeScriptUrl","existingScript","script","type","src","BridgeApiWaiter","readyPromise","readyResolver","readyEventHandler","readyTimeoutId","ensureReady","au2","__au2BridgeEnabled","waitForApi","cancel","finalize","resolveIfReady","isOwnerDestroyed","resolver","clearWaiters","clearTimeout","Au2Render","element","taskQueue","componentName","props","containerClass","enhanceResult","isDestroyed","hasAttached","mountGeneration","boundEventHandler","pendingProps","lastSyncedProps","bridgeStyles","projection","apiWaiter","Object","defineProperty","attached","mountWhenReady","detached","componentNameChanged","newValue","oldValue","queueMicroTask","propsChanged","newProps","_oldProps","syncPropsToAu2","snapshotProps","containerClassChanged","className","forceSync","updateProps","generation","isStale","mountAu2Component","initialProps","createContainer","projectedNodes","setupEventListener","dispatchBridgeEvent","join","dispose","queueTask","snapshot","baseline","changed","hasChanges","au2_render_values","keys","key","is","__assign","name","event","aurelia_framework","DOM","createCustomEvent","property","hasOwnProperty","changeEvent","removeChild","attachShadow","mode","inject","Element","TaskQueue","discoveredBridgeAssetStyleUrls","__decorate","bindable","defaultBindingMode","bindingMode","twoWay","Record","customElement"],"sourceRoot":""}