a reactive (signals based) hypermedia web framework (wip) stormlightlabs.github.io/volt/
hypermedia frontend signals
at main 2.1 kB view raw
1/** 2 * Plugin system for extending Volt.js with custom bindings 3 */ 4 5import type { Optional } from "$types/helpers"; 6import type { PluginHandler } from "$types/volt"; 7 8const pluginRegistry = new Map<string, PluginHandler>(); 9 10/** 11 * Register a custom plugin with a given name. 12 * Plugins extend Volt.js with custom data-volt-* attribute bindings. 13 * 14 * @param name - Plugin name (will be used as data-volt-{name}) 15 * @param handler - Plugin handler function 16 * 17 * @example 18 * registerPlugin('tooltip', (context, value) => { 19 * const tooltip = document.createElement('div'); 20 * tooltip.className = 'tooltip'; 21 * tooltip.textContent = value; 22 * context.element.addEventListener('mouseenter', () => { 23 * document.body.appendChild(tooltip); 24 * }); 25 * context.element.addEventListener('mouseleave', () => { 26 * tooltip.remove(); 27 * }); 28 * context.addCleanup(() => tooltip.remove()); 29 * }); 30 */ 31export function registerPlugin(name: string, handler: PluginHandler): void { 32 if (pluginRegistry.has(name)) { 33 console.warn(`Plugin "${name}" is already registered. Overwriting.`); 34 } 35 pluginRegistry.set(name, handler); 36} 37 38/** 39 * Get a plugin handler by name. 40 * 41 * @param name - Plugin name 42 * @returns Plugin handler function or undefined 43 */ 44export function getPlugin(name: string): Optional<PluginHandler> { 45 return pluginRegistry.get(name); 46} 47 48/** 49 * Check if a plugin is registered. 50 * 51 * @param name - Plugin name 52 * @returns true if the plugin is registered 53 */ 54export function hasPlugin(name: string): boolean { 55 return pluginRegistry.has(name); 56} 57 58/** 59 * Unregister a plugin by name. 60 * 61 * @param name - Plugin name 62 * @returns true if the plugin was unregistered, false if it wasn't registered 63 */ 64export function unregisterPlugin(name: string): boolean { 65 return pluginRegistry.delete(name); 66} 67 68/** 69 * Get all registered plugin names. 70 * 71 * @returns Array of registered plugin names 72 */ 73export function getRegisteredPlugins(): string[] { 74 return [...pluginRegistry.keys()]; 75} 76 77/** 78 * Clear all registered plugins. 79 */ 80export function clearPlugins(): void { 81 pluginRegistry.clear(); 82}