@jasonshimmy/custom-elements-runtime 1.2.2 → 2.0.0
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/README.md +157 -83
- package/dist/custom-elements-runtime.cjs.js +6 -146
- package/dist/custom-elements-runtime.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.directive-enhancements.cjs.js +2 -0
- package/dist/custom-elements-runtime.directive-enhancements.cjs.js.map +1 -0
- package/dist/custom-elements-runtime.directive-enhancements.es.js +144 -0
- package/dist/custom-elements-runtime.directive-enhancements.es.js.map +1 -0
- package/dist/custom-elements-runtime.directives.cjs.js +2 -0
- package/dist/custom-elements-runtime.directives.cjs.js.map +1 -0
- package/dist/custom-elements-runtime.directives.es.js +49 -0
- package/dist/custom-elements-runtime.directives.es.js.map +1 -0
- package/dist/custom-elements-runtime.es.js +2194 -4424
- package/dist/custom-elements-runtime.es.js.map +1 -1
- package/dist/custom-elements-runtime.event-bus.cjs.js +2 -0
- package/dist/custom-elements-runtime.event-bus.cjs.js.map +1 -0
- package/dist/custom-elements-runtime.event-bus.es.js +147 -0
- package/dist/custom-elements-runtime.event-bus.es.js.map +1 -0
- package/dist/custom-elements-runtime.router.cjs.js +29 -0
- package/dist/custom-elements-runtime.router.cjs.js.map +1 -0
- package/dist/custom-elements-runtime.router.es.js +305 -0
- package/dist/custom-elements-runtime.router.es.js.map +1 -0
- package/dist/custom-elements-runtime.ssr.cjs.js +2 -0
- package/dist/custom-elements-runtime.ssr.cjs.js.map +1 -0
- package/dist/custom-elements-runtime.ssr.es.js +18 -0
- package/dist/custom-elements-runtime.ssr.es.js.map +1 -0
- package/dist/custom-elements-runtime.store.cjs.js +2 -0
- package/dist/custom-elements-runtime.store.cjs.js.map +1 -0
- package/dist/custom-elements-runtime.store.es.js +25 -0
- package/dist/custom-elements-runtime.store.es.js.map +1 -0
- package/dist/custom-elements-runtime.transitions.cjs.js +2 -0
- package/dist/custom-elements-runtime.transitions.cjs.js.map +1 -0
- package/dist/custom-elements-runtime.transitions.es.js +10 -0
- package/dist/custom-elements-runtime.transitions.es.js.map +1 -0
- package/dist/directive-enhancements.d.ts +6 -6
- package/dist/directives.d.ts +2 -2
- package/dist/event-bus.d.ts +20 -11
- package/dist/helpers-CDfJhmMS.js +609 -0
- package/dist/helpers-CDfJhmMS.js.map +1 -0
- package/dist/helpers-D3UjNfYY.cjs +5 -0
- package/dist/helpers-D3UjNfYY.cjs.map +1 -0
- package/dist/index.d.ts +6 -20
- package/dist/logger-BpibrmKL.js +25 -0
- package/dist/logger-BpibrmKL.js.map +1 -0
- package/dist/logger-CqdBMdui.cjs +2 -0
- package/dist/logger-CqdBMdui.cjs.map +1 -0
- package/dist/router.d.ts +10 -15
- package/dist/runtime/component.d.ts +3 -3
- package/dist/runtime/event-manager.d.ts +3 -3
- package/dist/runtime/helpers.d.ts +4 -4
- package/dist/runtime/hooks.d.ts +3 -3
- package/dist/runtime/lifecycle.d.ts +1 -1
- package/dist/runtime/logger.d.ts +3 -3
- package/dist/runtime/node-metadata.d.ts +11 -2
- package/dist/runtime/props.d.ts +2 -2
- package/dist/runtime/reactive-proxy-cache.d.ts +6 -3
- package/dist/runtime/reactive.d.ts +5 -4
- package/dist/runtime/render.d.ts +4 -4
- package/dist/runtime/secure-expression-evaluator.d.ts +1 -1
- package/dist/runtime/template-compiler.d.ts +10 -10
- package/dist/runtime/transition-group-handler.d.ts +21 -0
- package/dist/runtime/transition-utils.d.ts +43 -3
- package/dist/runtime/types.d.ts +27 -17
- package/dist/runtime/vdom-model-helpers.d.ts +7 -7
- package/dist/runtime/vdom-ssr.d.ts +9 -0
- package/dist/runtime/vdom.d.ts +30 -22
- package/dist/runtime/watchers.d.ts +3 -3
- package/dist/ssr.d.ts +6 -0
- package/dist/store.d.ts +5 -1
- package/dist/transitions-Crm12oGl.cjs +115 -0
- package/dist/transitions-Crm12oGl.cjs.map +1 -0
- package/dist/transitions-D5YybtBE.js +1415 -0
- package/dist/transitions-D5YybtBE.js.map +1 -0
- package/dist/transitions.d.ts +5 -0
- package/package.json +57 -8
- package/dist/custom-elements-runtime.umd.js +0 -153
- package/dist/custom-elements-runtime.umd.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.router.es.js","sources":["../src/lib/router.ts"],"sourcesContent":["import { html } from './runtime/template-compiler';\nimport { component } from './runtime/component';\nimport {\n useProps,\n useOnConnected,\n useOnDisconnected,\n useStyle,\n} from './runtime/hooks';\nimport { ref, computed } from './runtime/reactive';\nimport { createStore, type Store } from './store';\nimport { devError, devWarn } from './runtime/logger';\nimport { match } from './directives';\n\nexport type RouteComponent =\n | { new (...args: unknown[]): unknown } // class components\n | ((...args: unknown[]) => unknown); // functional components\n\nexport interface RouteState {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\nexport type GuardResult = boolean | string | Promise<boolean | string>;\n\nexport interface Route {\n path: string;\n\n /**\n * Statically available component (already imported)\n */\n component?: string | (() => unknown);\n\n /**\n * Lazy loader that resolves to something renderable\n */\n load?: () => Promise<{\n default: string | HTMLElement | ((...args: unknown[]) => unknown);\n }>;\n\n /**\n * Runs before matching — return false to cancel,\n * or a string to redirect\n */\n beforeEnter?: (to: RouteState, from: RouteState) => GuardResult;\n\n /**\n * Runs right before navigation commits — can cancel or redirect\n */\n onEnter?: (to: RouteState, from: RouteState) => GuardResult;\n\n /**\n * Runs after navigation completes — cannot cancel\n */\n afterEnter?: (to: RouteState, from: RouteState) => void;\n}\n\nexport interface RouterLinkProps {\n to: string;\n tag: string;\n replace: boolean;\n exact: boolean;\n activeClass: string;\n exactActiveClass: string;\n ariaCurrentValue: string;\n disabled: boolean;\n external: boolean;\n linkClass?: string;\n linkStyle?: string;\n}\n\nexport interface RouterLinkComputed {\n current: RouteState;\n isExactActive: boolean;\n isActive: boolean;\n className: string;\n ariaCurrent: string;\n isButton: boolean;\n disabledAttr: string;\n externalAttr: string;\n}\n\nexport interface RouterConfig {\n routes: Route[];\n base?: string;\n initialUrl?: string; // For SSR: explicitly pass the URL\n}\n\nexport const parseQuery = (search: string): Record<string, string> => {\n if (!search) return {};\n if (typeof URLSearchParams === 'undefined') return {};\n return Object.fromEntries(new URLSearchParams(search));\n};\n\nexport const matchRoute = (\n routes: Route[],\n path: string,\n): { route: Route | null; params: Record<string, string> } => {\n for (const route of routes) {\n const paramNames: string[] = [];\n const regexPath = route.path.replace(/:[^/]+/g, (m) => {\n paramNames.push(m.slice(1));\n return '([^/]+)';\n });\n const regex = new RegExp(`^${regexPath}$`);\n const match = path.match(regex);\n if (match) {\n const params: Record<string, string> = {};\n paramNames.forEach((name, i) => {\n params[name] = match[i + 1];\n });\n return { route, params };\n }\n }\n return { route: null, params: {} };\n};\n\n/**\n * Find the first route that matches the given path.\n * Consolidates repeated inline checks like `routes.find(r => matchRoute([r], path).route !== null)`\n */\nfunction findMatchedRoute(routes: Route[], path: string): Route | null {\n for (const r of routes) {\n if (matchRoute([r], path).route !== null) return r;\n }\n return null;\n}\n\n// Async component loader cache\nconst componentCache: Record<\n string,\n string | HTMLElement | ((...args: unknown[]) => unknown)\n> = {};\n\n/**\n * Loads a route's component, supporting both static and async.\n * @param route Route object\n * @returns Promise resolving to the component\n */\nexport async function resolveRouteComponent(\n route: Route,\n): Promise<string | HTMLElement | ((...args: unknown[]) => unknown)> {\n if (route.component) return route.component;\n if (route.load) {\n if (componentCache[route.path]) return componentCache[route.path];\n try {\n const mod = await route.load();\n componentCache[route.path] = mod.default;\n return mod.default;\n } catch {\n throw new Error(`Failed to load component for route: ${route.path}`);\n }\n }\n throw new Error(`No component or loader defined for route: ${route.path}`);\n}\n\nexport function useRouter(config: RouterConfig) {\n const { routes, base = '', initialUrl } = config;\n\n let getLocation: () => { path: string; query: Record<string, string> };\n let initial: { path: string; query: Record<string, string> };\n let store: Store<RouteState>;\n let update: (replace?: boolean) => Promise<void>;\n let push: (path: string) => Promise<void>;\n let replaceFn: (path: string) => Promise<void>;\n let back: () => void;\n\n // Run matching route guards/hooks\n const runBeforeEnter = async (to: RouteState, from: RouteState) => {\n const matched = findMatchedRoute(routes, to.path);\n if (!matched || !matched.beforeEnter) return true;\n try {\n const result = await matched.beforeEnter(to, from);\n if (typeof result === 'string') {\n // Redirect\n await navigate(result, true);\n return false;\n }\n return result !== false;\n } catch (err) {\n devError('beforeEnter error', err);\n return false;\n }\n };\n\n const runOnEnter = async (to: RouteState, from: RouteState) => {\n const matched = findMatchedRoute(routes, to.path);\n if (!matched || !matched.onEnter) return true;\n try {\n const result = await matched.onEnter(to, from);\n if (typeof result === 'string') {\n await navigate(result, true);\n return false;\n }\n return result !== false;\n } catch (err) {\n devError('onEnter error', err);\n return false;\n }\n };\n\n const runAfterEnter = (to: RouteState, from: RouteState) => {\n const matched = findMatchedRoute(routes, to.path);\n if (!matched || !matched.afterEnter) return;\n try {\n matched.afterEnter(to, from);\n } catch (err) {\n devError('afterEnter error', err);\n }\n };\n\n const navigate = async (path: string, replace = false) => {\n try {\n const loc = {\n path: path.replace(base, '') || '/',\n query: {},\n };\n const match = matchRoute(routes, loc.path);\n if (!match.route) throw new Error(`No route found for ${loc.path}`);\n\n const from = store.getState();\n const to: RouteState = {\n path: loc.path,\n params: match.params,\n query: loc.query,\n };\n\n // beforeEnter guard\n const allowedBefore = await runBeforeEnter(to, from);\n if (!allowedBefore) return;\n\n // onEnter guard (right before commit)\n const allowedOn = await runOnEnter(to, from);\n if (!allowedOn) return;\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n if (replace) {\n window.history.replaceState({}, '', base + path);\n } else {\n window.history.pushState({}, '', base + path);\n }\n }\n\n store.setState(to);\n\n // afterEnter hook (post commit)\n runAfterEnter(to, from);\n } catch (err) {\n devError('Navigation error:', err);\n }\n };\n\n // If an explicit `initialUrl` is provided we treat this as SSR/static rendering\n // even if a `window` exists (useful for hydration tests). Browser mode only\n // applies when `initialUrl` is undefined.\n if (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined' &&\n typeof initialUrl === 'undefined'\n ) {\n // Browser mode\n getLocation = () => {\n const url = new URL(window.location.href);\n const path = url.pathname.replace(base, '') || '/';\n const query = parseQuery(url.search);\n return { path, query };\n };\n\n initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = createStore<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query,\n });\n\n update = async (replace = false) => {\n const loc = getLocation();\n await navigate(loc.path, replace);\n };\n\n window.addEventListener('popstate', () => update(true));\n\n push = (path: string) => navigate(path, false);\n replaceFn = (path: string) => navigate(path, true);\n back = () => window.history.back();\n } else {\n // SSR mode\n getLocation = () => {\n const url = new URL(initialUrl || '/', 'http://localhost');\n const path = url.pathname.replace(base, '') || '/';\n const query = parseQuery(url.search);\n return { path, query };\n };\n\n initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = createStore<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query,\n });\n\n update = async () => {\n const loc = getLocation();\n await navigateSSR(loc.path);\n };\n\n // SSR navigation contract:\n // - `push` / `replace` call into `navigateSSR` and return a Promise.\n // - On the server we intentionally surface navigation failures so\n // server-side logic (or tests) can react: missing routes or thrown\n // errors from `beforeEnter`/`onEnter` will cause the Promise to\n // reject. This lets the server render 404s or abort builds.\n // - For valid routes the server-side navigation resolves and updates\n // the internal store state so rendered output matches the target\n // path. The `back()` operation is client-only and is a synchronous\n // no-op in SSR mode.\n const navigateSSR = async (path: string) => {\n try {\n const loc = {\n path: path.replace(base, '') || '/',\n query: {},\n };\n const match = matchRoute(routes, loc.path);\n // In SSR mode we intentionally surface navigation errors (missing\n // route) to the caller so server-side logic may handle them. If no\n // route matches, throw and let the caller observe the rejection.\n if (!match.route) throw new Error(`No route found for ${loc.path}`);\n\n const from = store.getState();\n const to: RouteState = {\n path: loc.path,\n params: match.params,\n query: loc.query,\n };\n\n // beforeEnter guard\n const matched = findMatchedRoute(routes, to.path);\n if (matched?.beforeEnter) {\n const result = await matched.beforeEnter(to, from);\n if (typeof result === 'string') {\n // Redirect\n await navigateSSR(result);\n return;\n }\n if (result === false) return;\n }\n\n // onEnter guard\n if (matched?.onEnter) {\n const result = await matched.onEnter(to, from);\n if (typeof result === 'string') {\n await navigateSSR(result);\n return;\n }\n if (result === false) return;\n }\n\n store.setState(to);\n\n // afterEnter hook\n if (matched?.afterEnter) {\n matched.afterEnter(to, from);\n }\n } catch (err) {\n // Surface SSR navigation errors so callers (and tests) can observe\n // failures during server-side resolution.\n devError('SSR navigation error:', err);\n throw err;\n }\n };\n\n push = async (path: string) => navigateSSR(path);\n replaceFn = async (path: string) => navigateSSR(path);\n back = () => {};\n }\n\n return {\n store,\n push,\n replace: replaceFn,\n back,\n subscribe: store.subscribe,\n matchRoute: (path: string) => matchRoute(routes, path),\n getCurrent: (): RouteState => store.getState(),\n resolveRouteComponent,\n };\n}\n\n// SSR/static site support: match route for a given path\nexport function matchRouteSSR(routes: Route[], path: string) {\n return matchRoute(routes, path);\n}\n\n// Module-level reference to the latest initialized router. Tests and\n// components may rely on re-initializing the router during their setup,\n// so exposing this lets components pick up the most recent instance.\nlet activeRouter: ReturnType<typeof useRouter> | null = null;\n\n/**\n * Singleton router instance for global access.\n *\n * Define here to prevent circular dependency\n * issue with component.\n */\n\nexport function initRouter(config: RouterConfig) {\n const router = useRouter(config);\n // Expose the most recently initialized router to components defined\n // earlier in the process (tests may call initRouter multiple times).\n // Components reference `activeRouter` so re-calling initRouter updates\n // the router instance they use.\n activeRouter = router;\n\n component('router-view', async () => {\n // Prefer the latest initialized router (tests may re-init). Fallback\n // to the router captured at init time.\n const r = activeRouter || router;\n // Reactive current route so the component re-renders when router updates\n if (!r) return html`<div>Router not initialized.</div>`;\n\n const current = ref(r.getCurrent());\n\n // We'll capture the unsubscribe function when the component connects\n // and register a disconnect cleanup during render-time (useOnDisconnected\n // must be called during the component render/execution).\n let unsubRouterView: (() => void) | undefined;\n\n useOnConnected(() => {\n try {\n if (r && typeof r.subscribe === 'function') {\n unsubRouterView = r.subscribe((s) => {\n try {\n current.value = s;\n } catch (e) {\n devWarn('router-view subscription update failed', e);\n }\n });\n }\n } catch (e) {\n devWarn('router-view subscribe failed', e);\n }\n });\n\n useOnDisconnected(() => {\n if (typeof unsubRouterView === 'function') {\n try {\n unsubRouterView();\n } catch (e) {\n devWarn('router-view unsubscribe failed', e);\n }\n }\n });\n\n const match = r.matchRoute(current.value.path);\n if (!match || !match.route) return html`<div>Not found</div>`;\n\n // Resolve the component (supports cached async loaders)\n try {\n const compRaw = await r.resolveRouteComponent(match.route);\n const comp = compRaw as\n | string\n | HTMLElement\n | ((...args: unknown[]) => unknown)\n | undefined;\n // String tag (custom element) -> render as VNode\n if (typeof comp === 'string') {\n return { tag: comp, props: {}, children: [] };\n }\n\n // Function component (sync or async) -> call and return its VNode(s)\n if (typeof comp === 'function') {\n const out = comp();\n const resolved = out instanceof Promise ? out : Promise.resolve(out);\n return resolved.then((resolvedComp) => {\n if (typeof resolvedComp === 'string')\n return { tag: resolvedComp, props: {}, children: [] };\n return resolvedComp;\n });\n }\n\n return html`<div>Invalid route component</div>`;\n } catch {\n return html`<div>Invalid route component</div>`;\n }\n });\n\n component('router-link', () => {\n // Declare props via useProps so observedAttributes are correct\n const props = useProps<Partial<RouterLinkProps>>({\n to: '',\n tag: 'a',\n replace: false,\n exact: false,\n activeClass: 'active',\n exactActiveClass: 'exact-active',\n ariaCurrentValue: 'page',\n disabled: false,\n external: false,\n linkClass: '',\n linkStyle: '',\n });\n\n // Prefer the latest initialized router (tests may re-init). Fallback\n // to the router captured at init time.\n const r = activeRouter || router;\n // Reactive current state so link updates when route changes\n const current = ref(r.getCurrent());\n // Capture unsubscribe for link subscriptions and register disconnect\n // cleanup during render time.\n let unsubRouterLink: (() => void) | undefined;\n\n useStyle(\n () => (`a,button{display:inline-block;}` + props.linkStyle) as string,\n );\n\n useOnConnected(() => {\n try {\n if (r && typeof r.subscribe === 'function') {\n unsubRouterLink = r.subscribe((s) => {\n try {\n current.value = s;\n } catch (e) {\n devWarn('router-link subscription update failed', e);\n }\n });\n }\n } catch (e) {\n devWarn('router-link subscribe failed', e);\n }\n });\n\n useOnDisconnected(() => {\n if (typeof unsubRouterLink === 'function') {\n try {\n unsubRouterLink();\n } catch (e) {\n devWarn('router-link unsubscribe failed', e);\n }\n }\n });\n\n const isExactActive = computed(\n () => current.value.path === (props.to as string),\n );\n const isActive = computed(() =>\n props.exact\n ? isExactActive.value\n : current.value && typeof current.value.path === 'string'\n ? current.value.path.startsWith(props.to as string)\n : false,\n );\n\n // Build user classes reactively from the `linkClass` prop.\n // We intentionally do NOT read the host `class` attribute to avoid\n // duplicate styling applied to both host and inner element.\n const userClasses = computed(() => {\n const raw = (props.linkClass as string) || '';\n const list = raw.split(/\\s+/).filter(Boolean);\n const map: Record<string, boolean> = {};\n for (const c of list) map[c] = true;\n return map;\n });\n\n const classObject = computed(() => ({\n ...userClasses.value,\n [(props.activeClass as string) || 'active']: isActive.value,\n [(props.exactActiveClass as string) || 'exact-active']:\n isExactActive.value,\n }));\n\n const isButton = computed(() => (props.tag as string) === 'button');\n // Instead of pre-building attribute fragments as strings (which can\n // accidentally inject invalid attribute names into the template and\n // cause DOMExceptions), compute simple booleans/values and apply\n // attributes explicitly in the template below.\n const ariaCurrentValue = computed(() =>\n isExactActive.value ? (props.ariaCurrentValue as string) : '',\n );\n const isDisabled = computed(() => !!props.disabled);\n const isExternal = computed(\n () =>\n !!props.external &&\n ((props.tag as string) === 'a' || !(props.tag as string)),\n );\n\n const navigate = (e: MouseEvent) => {\n if (props.disabled) {\n e.preventDefault();\n return;\n }\n if (\n props.external &&\n ((props.tag as string) === 'a' || !(props.tag as string))\n ) {\n return;\n }\n e.preventDefault();\n if (props.replace) {\n r.replace(props.to as string);\n } else {\n r.push(props.to as string);\n }\n };\n\n return html`\n ${match()\n .when(\n isButton.value,\n html`\n <button\n part=\"button\"\n :class=\"${classObject.value}\"\n aria-current=\"${ariaCurrentValue.value}\"\n disabled=\"${isDisabled.value ? '' : null}\"\n aria-disabled=\"${isDisabled.value ? 'true' : null}\"\n tabindex=\"${isDisabled.value ? '-1' : null}\"\n @click=\"${navigate}\"\n >\n <slot></slot>\n </button>\n `,\n )\n .otherwise(html`\n <a\n part=\"link\"\n href=\"${props.to}\"\n :class=\"${classObject.value}\"\n aria-current=\"${ariaCurrentValue.value}\"\n aria-disabled=\"${isDisabled.value ? 'true' : null}\"\n tabindex=\"${isDisabled.value ? '-1' : null}\"\n target=\"${isExternal.value ? '_blank' : null}\"\n rel=\"${isExternal.value ? 'noopener noreferrer' : null}\"\n @click=\"${navigate}\"\n ><slot></slot\n ></a>\n `)\n .done()}\n `;\n });\n\n return router;\n}\n"],"names":["parseQuery","search","matchRoute","routes","path","route","paramNames","regexPath","m","regex","match","params","name","i","findMatchedRoute","r","componentCache","resolveRouteComponent","mod","useRouter","config","base","initialUrl","getLocation","initial","store","update","push","replaceFn","back","runBeforeEnter","to","from","matched","result","navigate","err","devError","runOnEnter","runAfterEnter","replace","loc","url","query","createStore","navigateSSR","matchRouteSSR","activeRouter","initRouter","router","component","html","current","ref","unsubRouterView","useOnConnected","e","devWarn","useOnDisconnected","comp","out","resolvedComp","props","useProps","unsubRouterLink","useStyle","s","isExactActive","computed","isActive","userClasses","list","map","c","classObject","isButton","ariaCurrentValue","isDisabled","isExternal"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./helpers-D3UjNfYY.cjs");function l(r){if(typeof r=="string")return e.escapeHTML(r);if(r.tag==="#text")return typeof r.children=="string"?e.escapeHTML(r.children):"";if(r.tag==="#anchor")return(Array.isArray(r.children)?r.children.filter(i=>i!=null):[]).map(l).join("");if(r.tag==="#raw")return typeof r.children=="string"?r.children:"";let c="";r.props&&r.props.attrs&&(c=Object.entries(r.props.attrs).map(([t,i])=>` ${t}="${e.escapeHTML(String(i))}"`).join(""));const a=Array.isArray(r.children)?r.children.filter(t=>t!=null).map(l).join(""):typeof r.children=="string"?e.escapeHTML(r.children):r.children?l(r.children):"";return`<${r.tag}${c}>${a}</${r.tag}>`}exports.renderToString=l;
|
|
2
|
+
//# sourceMappingURL=custom-elements-runtime.ssr.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.ssr.cjs.js","sources":["../src/lib/runtime/vdom-ssr.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { escapeHTML } from './helpers';\n\n/**\n * Render a VNode to a string (SSR).\n * Kept intentionally minimal: only serializes attributes under `props.attrs`\n * to avoid leaking runtime-only values (functions, reactive state, directives).\n * @param vnode The virtual node to render.\n * @returns The rendered HTML string.\n */\nexport function renderToString(vnode: VNode): string {\n if (typeof vnode === 'string') return escapeHTML(vnode) as string;\n\n if (vnode.tag === '#text') {\n return typeof vnode.children === 'string'\n ? (escapeHTML(vnode.children) as string)\n : '';\n }\n\n if (vnode.tag === '#anchor') {\n // Preserve meaningful falsy children (0, false, '') while filtering out\n // only null and undefined. Anchor blocks are normalized by the compiler\n // to exclude null/undefined; SSR should follow the same rule to avoid\n // hydration mismatches where falsy values are significant.\n const children = Array.isArray(vnode.children)\n ? vnode.children.filter((c) => c !== null && c !== undefined)\n : [];\n return children.map(renderToString).join('');\n }\n\n if (vnode.tag === '#raw') {\n return typeof vnode.children === 'string' ? vnode.children : '';\n }\n\n // Collect attributes from props.attrs\n let attrsString = '';\n if (vnode.props && vnode.props.attrs) {\n attrsString = Object.entries(vnode.props.attrs)\n .map(([k, v]) => ` ${k}=\"${escapeHTML(String(v))}\"`)\n .join('');\n }\n\n const children = Array.isArray(vnode.children)\n ? vnode.children\n .filter((c) => c !== null && c !== undefined)\n .map(renderToString)\n .join('')\n : typeof vnode.children === 'string'\n ? escapeHTML(vnode.children)\n : vnode.children\n ? renderToString(vnode.children)\n : '';\n\n return `<${vnode.tag}${attrsString}>${children}</${vnode.tag}>`;\n}\n"],"names":["renderToString","vnode","escapeHTML","c","attrsString","k","v","children"],"mappings":"0HAUO,SAASA,EAAeC,EAAsB,CACnD,GAAI,OAAOA,GAAU,SAAU,OAAOC,EAAAA,WAAWD,CAAK,EAEtD,GAAIA,EAAM,MAAQ,QAChB,OAAO,OAAOA,EAAM,UAAa,SAC5BC,EAAAA,WAAWD,EAAM,QAAQ,EAC1B,GAGN,GAAIA,EAAM,MAAQ,UAQhB,OAHiB,MAAM,QAAQA,EAAM,QAAQ,EACzCA,EAAM,SAAS,OAAQE,GAAMA,GAAM,IAAuB,EAC1D,CAAA,GACY,IAAIH,CAAc,EAAE,KAAK,EAAE,EAG7C,GAAIC,EAAM,MAAQ,OAChB,OAAO,OAAOA,EAAM,UAAa,SAAWA,EAAM,SAAW,GAI/D,IAAIG,EAAc,GACdH,EAAM,OAASA,EAAM,MAAM,QAC7BG,EAAc,OAAO,QAAQH,EAAM,MAAM,KAAK,EAC3C,IAAI,CAAC,CAACI,EAAGC,CAAC,IAAM,IAAID,CAAC,KAAKH,EAAAA,WAAW,OAAOI,CAAC,CAAC,CAAC,GAAG,EAClD,KAAK,EAAE,GAGZ,MAAMC,EAAW,MAAM,QAAQN,EAAM,QAAQ,EACzCA,EAAM,SACH,OAAQE,GAAMA,GAAM,IAAuB,EAC3C,IAAIH,CAAc,EAClB,KAAK,EAAE,EACV,OAAOC,EAAM,UAAa,SACxBC,EAAAA,WAAWD,EAAM,QAAQ,EACzBA,EAAM,SACJD,EAAeC,EAAM,QAAQ,EAC7B,GAER,MAAO,IAAIA,EAAM,GAAG,GAAGG,CAAW,IAAIG,CAAQ,KAAKN,EAAM,GAAG,GAC9D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { e as l } from "./helpers-CDfJhmMS.js";
|
|
2
|
+
function a(r) {
|
|
3
|
+
if (typeof r == "string") return l(r);
|
|
4
|
+
if (r.tag === "#text")
|
|
5
|
+
return typeof r.children == "string" ? l(r.children) : "";
|
|
6
|
+
if (r.tag === "#anchor")
|
|
7
|
+
return (Array.isArray(r.children) ? r.children.filter((t) => t != null) : []).map(a).join("");
|
|
8
|
+
if (r.tag === "#raw")
|
|
9
|
+
return typeof r.children == "string" ? r.children : "";
|
|
10
|
+
let c = "";
|
|
11
|
+
r.props && r.props.attrs && (c = Object.entries(r.props.attrs).map(([i, t]) => ` ${i}="${l(String(t))}"`).join(""));
|
|
12
|
+
const n = Array.isArray(r.children) ? r.children.filter((i) => i != null).map(a).join("") : typeof r.children == "string" ? l(r.children) : r.children ? a(r.children) : "";
|
|
13
|
+
return `<${r.tag}${c}>${n}</${r.tag}>`;
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
a as renderToString
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=custom-elements-runtime.ssr.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.ssr.es.js","sources":["../src/lib/runtime/vdom-ssr.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { escapeHTML } from './helpers';\n\n/**\n * Render a VNode to a string (SSR).\n * Kept intentionally minimal: only serializes attributes under `props.attrs`\n * to avoid leaking runtime-only values (functions, reactive state, directives).\n * @param vnode The virtual node to render.\n * @returns The rendered HTML string.\n */\nexport function renderToString(vnode: VNode): string {\n if (typeof vnode === 'string') return escapeHTML(vnode) as string;\n\n if (vnode.tag === '#text') {\n return typeof vnode.children === 'string'\n ? (escapeHTML(vnode.children) as string)\n : '';\n }\n\n if (vnode.tag === '#anchor') {\n // Preserve meaningful falsy children (0, false, '') while filtering out\n // only null and undefined. Anchor blocks are normalized by the compiler\n // to exclude null/undefined; SSR should follow the same rule to avoid\n // hydration mismatches where falsy values are significant.\n const children = Array.isArray(vnode.children)\n ? vnode.children.filter((c) => c !== null && c !== undefined)\n : [];\n return children.map(renderToString).join('');\n }\n\n if (vnode.tag === '#raw') {\n return typeof vnode.children === 'string' ? vnode.children : '';\n }\n\n // Collect attributes from props.attrs\n let attrsString = '';\n if (vnode.props && vnode.props.attrs) {\n attrsString = Object.entries(vnode.props.attrs)\n .map(([k, v]) => ` ${k}=\"${escapeHTML(String(v))}\"`)\n .join('');\n }\n\n const children = Array.isArray(vnode.children)\n ? vnode.children\n .filter((c) => c !== null && c !== undefined)\n .map(renderToString)\n .join('')\n : typeof vnode.children === 'string'\n ? escapeHTML(vnode.children)\n : vnode.children\n ? renderToString(vnode.children)\n : '';\n\n return `<${vnode.tag}${attrsString}>${children}</${vnode.tag}>`;\n}\n"],"names":["renderToString","vnode","escapeHTML","c","attrsString","k","v","children"],"mappings":";AAUO,SAASA,EAAeC,GAAsB;AACnD,MAAI,OAAOA,KAAU,SAAU,QAAOC,EAAWD,CAAK;AAEtD,MAAIA,EAAM,QAAQ;AAChB,WAAO,OAAOA,EAAM,YAAa,WAC5BC,EAAWD,EAAM,QAAQ,IAC1B;AAGN,MAAIA,EAAM,QAAQ;AAQhB,YAHiB,MAAM,QAAQA,EAAM,QAAQ,IACzCA,EAAM,SAAS,OAAO,CAACE,MAAMA,KAAM,IAAuB,IAC1D,CAAA,GACY,IAAIH,CAAc,EAAE,KAAK,EAAE;AAG7C,MAAIC,EAAM,QAAQ;AAChB,WAAO,OAAOA,EAAM,YAAa,WAAWA,EAAM,WAAW;AAI/D,MAAIG,IAAc;AAClB,EAAIH,EAAM,SAASA,EAAM,MAAM,UAC7BG,IAAc,OAAO,QAAQH,EAAM,MAAM,KAAK,EAC3C,IAAI,CAAC,CAACI,GAAGC,CAAC,MAAM,IAAID,CAAC,KAAKH,EAAW,OAAOI,CAAC,CAAC,CAAC,GAAG,EAClD,KAAK,EAAE;AAGZ,QAAMC,IAAW,MAAM,QAAQN,EAAM,QAAQ,IACzCA,EAAM,SACH,OAAO,CAACE,MAAMA,KAAM,IAAuB,EAC3C,IAAIH,CAAc,EAClB,KAAK,EAAE,IACV,OAAOC,EAAM,YAAa,WACxBC,EAAWD,EAAM,QAAQ,IACzBA,EAAM,WACJD,EAAeC,EAAM,QAAQ,IAC7B;AAER,SAAO,IAAIA,EAAM,GAAG,GAAGG,CAAW,IAAIG,CAAQ,KAAKN,EAAM,GAAG;AAC9D;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function s(c){let e={...c};const n=[];function u(t){return n.push(t),t(e),()=>{const o=n.indexOf(t);o!==-1&&n.splice(o,1)}}function r(){return e}function f(t){const o=typeof t=="function"?t(e):t;e={...e,...o},i()}function i(){n.forEach(t=>t(e))}return{subscribe:u,getState:r,setState:f}}exports.createStore=s;
|
|
2
|
+
//# sourceMappingURL=custom-elements-runtime.store.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.store.cjs.js","sources":["../src/lib/store.ts"],"sourcesContent":["type Listener<T> = (state: T) => void;\n\nexport interface Store<T extends object> {\n /**\n * Subscribe to store updates.\n * Returns an unsubscribe function to remove the listener.\n */\n subscribe(listener: Listener<T>): () => void;\n getState(): T;\n setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;\n}\n\nexport function createStore<T extends object>(initial: T): Store<T> {\n let state = { ...initial } as T; // no Proxy needed if we update via setState\n const listeners: Listener<T>[] = [];\n\n function subscribe(listener: Listener<T>) {\n listeners.push(listener);\n listener(state); // initial push\n\n // Return unsubscribe function\n return () => {\n const idx = listeners.indexOf(listener);\n if (idx !== -1) listeners.splice(idx, 1);\n };\n }\n\n function getState(): T {\n return state;\n }\n\n function setState(partial: Partial<T> | ((prev: T) => Partial<T>)) {\n const next = typeof partial === 'function' ? partial(state) : partial;\n\n state = { ...state, ...next };\n notify();\n }\n\n function notify() {\n listeners.forEach((fn) => fn(state));\n }\n\n return { subscribe, getState, setState };\n}\n"],"names":["createStore","initial","state","listeners","subscribe","listener","idx","getState","setState","partial","next","notify","fn"],"mappings":"gFAYO,SAASA,EAA8BC,EAAsB,CAClE,IAAIC,EAAQ,CAAE,GAAGD,CAAA,EACjB,MAAME,EAA2B,CAAA,EAEjC,SAASC,EAAUC,EAAuB,CACxC,OAAAF,EAAU,KAAKE,CAAQ,EACvBA,EAASH,CAAK,EAGP,IAAM,CACX,MAAMI,EAAMH,EAAU,QAAQE,CAAQ,EAClCC,IAAQ,IAAIH,EAAU,OAAOG,EAAK,CAAC,CACzC,CACF,CAEA,SAASC,GAAc,CACrB,OAAOL,CACT,CAEA,SAASM,EAASC,EAAiD,CACjE,MAAMC,EAAO,OAAOD,GAAY,WAAaA,EAAQP,CAAK,EAAIO,EAE9DP,EAAQ,CAAE,GAAGA,EAAO,GAAGQ,CAAA,EACvBC,EAAA,CACF,CAEA,SAASA,GAAS,CAChBR,EAAU,QAASS,GAAOA,EAAGV,CAAK,CAAC,CACrC,CAEA,MAAO,CAAE,UAAAE,EAAW,SAAAG,EAAU,SAAAC,CAAA,CAChC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function r(c) {
|
|
2
|
+
let n = { ...c };
|
|
3
|
+
const e = [];
|
|
4
|
+
function f(t) {
|
|
5
|
+
return e.push(t), t(n), () => {
|
|
6
|
+
const o = e.indexOf(t);
|
|
7
|
+
o !== -1 && e.splice(o, 1);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function u() {
|
|
11
|
+
return n;
|
|
12
|
+
}
|
|
13
|
+
function i(t) {
|
|
14
|
+
const o = typeof t == "function" ? t(n) : t;
|
|
15
|
+
n = { ...n, ...o }, s();
|
|
16
|
+
}
|
|
17
|
+
function s() {
|
|
18
|
+
e.forEach((t) => t(n));
|
|
19
|
+
}
|
|
20
|
+
return { subscribe: f, getState: u, setState: i };
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
r as createStore
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=custom-elements-runtime.store.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.store.es.js","sources":["../src/lib/store.ts"],"sourcesContent":["type Listener<T> = (state: T) => void;\n\nexport interface Store<T extends object> {\n /**\n * Subscribe to store updates.\n * Returns an unsubscribe function to remove the listener.\n */\n subscribe(listener: Listener<T>): () => void;\n getState(): T;\n setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;\n}\n\nexport function createStore<T extends object>(initial: T): Store<T> {\n let state = { ...initial } as T; // no Proxy needed if we update via setState\n const listeners: Listener<T>[] = [];\n\n function subscribe(listener: Listener<T>) {\n listeners.push(listener);\n listener(state); // initial push\n\n // Return unsubscribe function\n return () => {\n const idx = listeners.indexOf(listener);\n if (idx !== -1) listeners.splice(idx, 1);\n };\n }\n\n function getState(): T {\n return state;\n }\n\n function setState(partial: Partial<T> | ((prev: T) => Partial<T>)) {\n const next = typeof partial === 'function' ? partial(state) : partial;\n\n state = { ...state, ...next };\n notify();\n }\n\n function notify() {\n listeners.forEach((fn) => fn(state));\n }\n\n return { subscribe, getState, setState };\n}\n"],"names":["createStore","initial","state","listeners","subscribe","listener","idx","getState","setState","partial","next","notify","fn"],"mappings":"AAYO,SAASA,EAA8BC,GAAsB;AAClE,MAAIC,IAAQ,EAAE,GAAGD,EAAA;AACjB,QAAME,IAA2B,CAAA;AAEjC,WAASC,EAAUC,GAAuB;AACxC,WAAAF,EAAU,KAAKE,CAAQ,GACvBA,EAASH,CAAK,GAGP,MAAM;AACX,YAAMI,IAAMH,EAAU,QAAQE,CAAQ;AACtC,MAAIC,MAAQ,MAAIH,EAAU,OAAOG,GAAK,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,WAASC,IAAc;AACrB,WAAOL;AAAA,EACT;AAEA,WAASM,EAASC,GAAiD;AACjE,UAAMC,IAAO,OAAOD,KAAY,aAAaA,EAAQP,CAAK,IAAIO;AAE9D,IAAAP,IAAQ,EAAE,GAAGA,GAAO,GAAGQ,EAAA,GACvBC,EAAA;AAAA,EACF;AAEA,WAASA,IAAS;AAChB,IAAAR,EAAU,QAAQ,CAACS,MAAOA,EAAGV,CAAK,CAAC;AAAA,EACrC;AAEA,SAAO,EAAE,WAAAE,GAAW,UAAAG,GAAU,UAAAC,EAAA;AAChC;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("./custom-elements-runtime.directives.cjs.js");const t=require("./transitions-Crm12oGl.cjs");exports.Transition=t.Transition;exports.TransitionGroup=t.TransitionGroup;exports.createTransitionPreset=t.createTransitionPreset;exports.getTransitionStyleSheet=t.getTransitionStyleSheet;exports.transitionPresets=t.transitionPresets;
|
|
2
|
+
//# sourceMappingURL=custom-elements-runtime.transitions.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.transitions.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "./custom-elements-runtime.directives.es.js";
|
|
2
|
+
import { T as r, b as e, d as i, a as n, t as o } from "./transitions-D5YybtBE.js";
|
|
3
|
+
export {
|
|
4
|
+
r as Transition,
|
|
5
|
+
e as TransitionGroup,
|
|
6
|
+
i as createTransitionPreset,
|
|
7
|
+
n as getTransitionStyleSheet,
|
|
8
|
+
o as transitionPresets
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=custom-elements-runtime.transitions.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.transitions.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { VNode } from
|
|
1
|
+
import type { VNode } from './runtime/types';
|
|
2
2
|
/**
|
|
3
3
|
* Conditional rendering with negated condition (opposite of when)
|
|
4
4
|
* @param cond - Boolean condition to negate
|
|
@@ -10,13 +10,13 @@ export declare function unless(cond: boolean, children: VNode | VNode[]): VNode;
|
|
|
10
10
|
* @param collection - Array or collection to check
|
|
11
11
|
* @param children - Content to render when empty
|
|
12
12
|
*/
|
|
13
|
-
export declare function whenEmpty(collection:
|
|
13
|
+
export declare function whenEmpty<T>(collection: T[] | null | undefined, children: VNode | VNode[]): VNode;
|
|
14
14
|
/**
|
|
15
15
|
* Render content only if array/collection has items
|
|
16
16
|
* @param collection - Array or collection to check
|
|
17
17
|
* @param children - Content to render when not empty
|
|
18
18
|
*/
|
|
19
|
-
export declare function whenNotEmpty(collection:
|
|
19
|
+
export declare function whenNotEmpty<T>(collection: T[] | null | undefined, children: VNode | VNode[]): VNode;
|
|
20
20
|
/**
|
|
21
21
|
* Enhanced each with filtering capability
|
|
22
22
|
* @param list - Array to iterate over
|
|
@@ -81,7 +81,7 @@ export declare const mediaVariants: {
|
|
|
81
81
|
readonly md: "(min-width:768px)";
|
|
82
82
|
readonly lg: "(min-width:1024px)";
|
|
83
83
|
readonly xl: "(min-width:1280px)";
|
|
84
|
-
readonly
|
|
84
|
+
readonly '2xl': "(min-width:1536px)";
|
|
85
85
|
readonly dark: "(prefers-color-scheme: dark)";
|
|
86
86
|
};
|
|
87
87
|
/**
|
|
@@ -96,7 +96,7 @@ export declare const responsive: {
|
|
|
96
96
|
readonly md: (children: VNode | VNode[]) => VNode;
|
|
97
97
|
readonly lg: (children: VNode | VNode[]) => VNode;
|
|
98
98
|
readonly xl: (children: VNode | VNode[]) => VNode;
|
|
99
|
-
readonly
|
|
99
|
+
readonly '2xl': (children: VNode | VNode[]) => VNode;
|
|
100
100
|
readonly dark: (children: VNode | VNode[]) => VNode;
|
|
101
101
|
readonly light: (children: VNode | VNode[]) => VNode;
|
|
102
102
|
readonly touch: (children: VNode | VNode[]) => VNode;
|
|
@@ -124,7 +124,7 @@ export declare function responsiveSwitch(content: {
|
|
|
124
124
|
md?: VNode | VNode[];
|
|
125
125
|
lg?: VNode | VNode[];
|
|
126
126
|
xl?: VNode | VNode[];
|
|
127
|
-
|
|
127
|
+
'2xl'?: VNode | VNode[];
|
|
128
128
|
}): VNode[];
|
|
129
129
|
/**
|
|
130
130
|
* Enhanced match directive with more fluent API
|
package/dist/directives.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { VNode } from
|
|
1
|
+
import type { VNode } from './runtime/types';
|
|
2
2
|
export declare function when(cond: boolean, children: VNode | VNode[]): VNode;
|
|
3
3
|
export declare function when(cond: boolean, factory: () => VNode | VNode[]): VNode;
|
|
4
4
|
export declare function each<T extends string | number | boolean | {
|
|
@@ -6,7 +6,7 @@ export declare function each<T extends string | number | boolean | {
|
|
|
6
6
|
key?: string;
|
|
7
7
|
}>(list: T[], render: (item: T, index: number) => VNode | VNode[]): VNode[];
|
|
8
8
|
export declare function match(): {
|
|
9
|
-
when(cond:
|
|
9
|
+
when(cond: unknown, content: VNode | VNode[] | (() => VNode | VNode[])): /*elided*/ any;
|
|
10
10
|
otherwise(content: VNode | VNode[]): /*elided*/ any;
|
|
11
11
|
done(): VNode[];
|
|
12
12
|
};
|
package/dist/event-bus.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Event handler type for global event bus
|
|
3
3
|
*/
|
|
4
|
-
export type EventHandler<T
|
|
4
|
+
export type EventHandler<T> = (data: T) => void;
|
|
5
5
|
/**
|
|
6
6
|
* GlobalEventBus provides a singleton event bus for cross-component communication.
|
|
7
7
|
* Uses Set for handler storage to optimize add/remove operations and prevent duplicates.
|
|
@@ -19,19 +19,19 @@ export declare class GlobalEventBus extends EventTarget {
|
|
|
19
19
|
* @param eventName - Name of the event
|
|
20
20
|
* @param data - Optional event payload
|
|
21
21
|
*/
|
|
22
|
-
emit<T =
|
|
22
|
+
emit<T = unknown>(eventName: string, data?: T): void;
|
|
23
23
|
/**
|
|
24
24
|
* Register a handler for a global event. Returns an unsubscribe function.
|
|
25
25
|
* @param eventName - Name of the event
|
|
26
26
|
* @param handler - Handler function
|
|
27
27
|
*/
|
|
28
|
-
on<T =
|
|
28
|
+
on<T = unknown>(eventName: string, handler: EventHandler<T>): () => void;
|
|
29
29
|
/**
|
|
30
30
|
* Remove a specific handler for a global event.
|
|
31
31
|
* @param eventName - Name of the event
|
|
32
32
|
* @param handler - Handler function to remove
|
|
33
33
|
*/
|
|
34
|
-
off<T =
|
|
34
|
+
off<T = unknown>(eventName: string, handler: EventHandler<T>): void;
|
|
35
35
|
/**
|
|
36
36
|
* Remove all handlers for a specific event.
|
|
37
37
|
* @param eventName - Name of the event
|
|
@@ -43,13 +43,13 @@ export declare class GlobalEventBus extends EventTarget {
|
|
|
43
43
|
* @param handler - CustomEvent handler
|
|
44
44
|
* @param options - AddEventListener options
|
|
45
45
|
*/
|
|
46
|
-
listen<T =
|
|
46
|
+
listen<T = unknown>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions): () => void;
|
|
47
47
|
/**
|
|
48
48
|
* Register a one-time event handler. Returns a promise that resolves with the event data.
|
|
49
49
|
* @param eventName - Name of the event
|
|
50
50
|
* @param handler - Handler function
|
|
51
51
|
*/
|
|
52
|
-
once<T =
|
|
52
|
+
once<T = unknown>(eventName: string, handler: EventHandler<T>): Promise<T>;
|
|
53
53
|
/**
|
|
54
54
|
* Get a list of all active event names with registered handlers.
|
|
55
55
|
*/
|
|
@@ -78,24 +78,33 @@ export declare class GlobalEventBus extends EventTarget {
|
|
|
78
78
|
/**
|
|
79
79
|
* Singleton instance of the global event bus
|
|
80
80
|
*/
|
|
81
|
+
/**
|
|
82
|
+
* Lazily-instantiated event bus.
|
|
83
|
+
*
|
|
84
|
+
* We preserve the `eventBus` export for backward compatibility but avoid
|
|
85
|
+
* creating the underlying GlobalEventBus instance at module import time.
|
|
86
|
+
* A small proxy defers the call to `GlobalEventBus.getInstance()` until a
|
|
87
|
+
* property is accessed. This reduces import-time side-effects and helps
|
|
88
|
+
* bundlers tree-shake unused entrypoints.
|
|
89
|
+
*/
|
|
81
90
|
export declare const eventBus: GlobalEventBus;
|
|
82
91
|
/**
|
|
83
92
|
* Emit a global event
|
|
84
93
|
*/
|
|
85
|
-
export declare const emit: <T =
|
|
94
|
+
export declare const emit: <T = unknown>(eventName: string, data?: T) => void;
|
|
86
95
|
/**
|
|
87
96
|
* Register a handler for a global event
|
|
88
97
|
*/
|
|
89
|
-
export declare const on: <T =
|
|
98
|
+
export declare const on: <T = unknown>(eventName: string, handler: EventHandler<T>) => () => void;
|
|
90
99
|
/**
|
|
91
100
|
* Remove a handler for a global event
|
|
92
101
|
*/
|
|
93
|
-
export declare const off: <T =
|
|
102
|
+
export declare const off: <T = unknown>(eventName: string, handler: EventHandler<T>) => void;
|
|
94
103
|
/**
|
|
95
104
|
* Register a one-time handler for a global event
|
|
96
105
|
*/
|
|
97
|
-
export declare const once: <T =
|
|
106
|
+
export declare const once: <T = unknown>(eventName: string, handler: EventHandler<T>) => Promise<T>;
|
|
98
107
|
/**
|
|
99
108
|
* Listen for a native CustomEvent
|
|
100
109
|
*/
|
|
101
|
-
export declare const listen: <T =
|
|
110
|
+
export declare const listen: <T = unknown>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions) => () => void;
|