a reactive (signals based) hypermedia web framework (wip)
stormlightlabs.github.io/volt/
hypermedia
frontend
signals
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}