diff --git a/.gitignore b/.gitignore index f4e2c6d..ff2c585 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ node_modules/ -dist/ *.tsbuildinfo diff --git a/dist/PluginContext.d.ts b/dist/PluginContext.d.ts new file mode 100644 index 0000000..34a2d94 --- /dev/null +++ b/dist/PluginContext.d.ts @@ -0,0 +1,31 @@ +import type { PluginContext, NotificationOptions } from './PluginInterfaces.js'; +import type { IPluginEventClient } from './interfaces.js'; +import type { PluginRegistry } from './PluginRegistry.js'; +/** + * Options for constructing a PluginContext via `createPluginContext`. + */ +export interface PluginContextOptions { + /** The plugin's unique identifier. */ + pluginId: string; + /** + * Optional event client for the `context.events` API. + * Any object implementing `on(event, handler)` / `off(event, handler)` works — + * e.g. a MatrixClient, Node.js EventEmitter, or socket.io socket. + */ + eventClient?: IPluginEventClient; + /** + * Called when a plugin invokes `context.notify(...)`. + * The host is responsible for displaying the notification however it wants. + */ + onNotify?: (options: NotificationOptions) => void | Promise; +} +/** + * Creates a PluginContext wired to the given registry. + * Call this before registering and loading a plugin. + * + * @param options - Host-specific dependencies for the plugin. + * @param registry - The shared PluginRegistry instance. + * @returns A fully-wired PluginContext ready to be passed to `plugin.onLoad`. + */ +export declare function createPluginContext(options: PluginContextOptions, registry: PluginRegistry): PluginContext; +//# sourceMappingURL=PluginContext.d.ts.map \ No newline at end of file diff --git a/dist/PluginContext.d.ts.map b/dist/PluginContext.d.ts.map new file mode 100644 index 0000000..29b6daf --- /dev/null +++ b/dist/PluginContext.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PluginContext.d.ts","sourceRoot":"","sources":["../src/PluginContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAEjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,cAAc,GACvB,aAAa,CAqJf"} \ No newline at end of file diff --git a/dist/PluginContext.js b/dist/PluginContext.js new file mode 100644 index 0000000..b4d4f3a --- /dev/null +++ b/dist/PluginContext.js @@ -0,0 +1,151 @@ +/** + * Creates a PluginContext wired to the given registry. + * Call this before registering and loading a plugin. + * + * @param options - Host-specific dependencies for the plugin. + * @param registry - The shared PluginRegistry instance. + * @returns A fully-wired PluginContext ready to be passed to `plugin.onLoad`. + */ +export function createPluginContext(options, registry) { + const { pluginId, eventClient, onNotify } = options; + return { + pluginId, + commands: { + register: (command) => { + registry.registerCommand(pluginId, command); + registry.addLog(pluginId, 'log', [`Registered command: /${command.name}`]); + }, + unregister: (name) => { + registry.unregisterCommand(name); + }, + execute: async (name, args) => { + return registry.executeCommand(name, JSON.stringify(args)); + }, + }, + messages: { + onBeforeSend: (interceptor) => { + registry.addBeforeSendInterceptor(pluginId, interceptor); + registry.addLog(pluginId, 'log', ['Registered beforeSend interceptor']); + }, + onReceive: (interceptor) => { + registry.addReceiveInterceptor(pluginId, interceptor); + registry.addLog(pluginId, 'log', ['Registered receive interceptor']); + }, + }, + ui: { + registerRenderer: (type, renderer) => { + registry.registerRenderer(pluginId, type, renderer); + registry.addLog(pluginId, 'log', [`Registered renderer: ${type}`]); + }, + unregisterRenderer: (type) => { + registry.unregisterRenderer(type); + }, + }, + settings: { + define: (schema) => { + registry.defineSettings(pluginId, schema); + registry.addLog(pluginId, 'log', ['Defined settings schema']); + }, + get: (key) => { + return registry.getPluginSetting(pluginId, key); + }, + set: (key, value) => { + registry.setPluginSetting(pluginId, key, value); + }, + }, + themes: { + register: (theme) => { + registry.registerTheme(pluginId, theme); + registry.addLog(pluginId, 'log', [`Registered theme: ${theme.name}`]); + }, + unregister: (themeId) => { + registry.unregisterTheme(pluginId, themeId); + }, + }, + events: { + on: (eventType, handler) => { + if (!eventClient) { + console.warn(`[Plugin ${pluginId}] No event client provided — events.on() is a no-op`); + return; + } + registry.addEventHandler(pluginId, eventType, handler); + eventClient.on(eventType, handler); + registry.addLog(pluginId, 'log', [`Listening to event: ${eventType}`]); + }, + off: (eventType, handler) => { + if (!eventClient) + return; + registry.removeEventHandler(pluginId, eventType, handler); + eventClient.off(eventType, handler); + }, + }, + timers: { + setInterval: (callback, ms) => { + const id = setInterval(() => { + try { + callback(); + } + catch (err) { + registry.addLog(pluginId, 'error', ['Interval error:', err]); + } + }, ms); + registry.addTimer(pluginId, id); + return id; + }, + setTimeout: (callback, ms) => { + const id = setTimeout(() => { + try { + callback(); + } + catch (err) { + registry.addLog(pluginId, 'error', ['Timeout error:', err]); + } + registry.removeTimer(pluginId, id); + }, ms); + registry.addTimer(pluginId, id); + return id; + }, + clearInterval: (id) => { + clearInterval(id); + registry.removeTimer(pluginId, id); + }, + clearTimeout: (id) => { + clearTimeout(id); + registry.removeTimer(pluginId, id); + }, + }, + notify: async (options) => { + const opts = typeof options === 'string' ? { title: 'Plugin', body: options } : options; + registry.addLog(pluginId, 'log', ['Notification:', opts]); + if (onNotify) { + try { + await onNotify(opts); + } + catch (err) { + console.error(`[Plugin ${pluginId}] Notification handler error:`, err); + } + } + }, + log: (...args) => { + console.log(`[Plugin ${pluginId}]`, ...args); + registry.addLog(pluginId, 'log', args); + }, + warn: (...args) => { + console.warn(`[Plugin ${pluginId}]`, ...args); + registry.addLog(pluginId, 'warn', args); + }, + error: (...args) => { + console.error(`[Plugin ${pluginId}]`, ...args); + registry.addLog(pluginId, 'error', args); + }, + require: (requiredPluginId) => { + const exports = registry.getPluginExports(requiredPluginId); + if (exports === undefined) { + throw new Error(`Plugin ${requiredPluginId} not found or has no exports`); + } + registry.addLog(pluginId, 'log', [`Required plugin: ${requiredPluginId}`]); + return exports; + }, + }; +} +//# sourceMappingURL=PluginContext.js.map \ No newline at end of file diff --git a/dist/PluginContext.js.map b/dist/PluginContext.js.map new file mode 100644 index 0000000..14a027b --- /dev/null +++ b/dist/PluginContext.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PluginContext.js","sourceRoot":"","sources":["../src/PluginContext.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/PluginInterfaces.d.ts b/dist/PluginInterfaces.d.ts new file mode 100644 index 0000000..265642f --- /dev/null +++ b/dist/PluginInterfaces.d.ts @@ -0,0 +1,215 @@ +/** + * Color group with five container variants and an OnContainer text color. + */ +export interface ThemeColorGroup { + container: string; + containerHover: string; + containerActive: string; + containerLine: string; + onContainer: string; +} +/** + * Color group for interactive palette entries (Main + Container sub-groups). + */ +export interface ThemePaletteGroup { + main: string; + mainHover: string; + mainActive: string; + mainLine: string; + onMain: string; + container: string; + containerHover: string; + containerActive: string; + containerLine: string; + onContainer: string; +} +/** + * Full color token set for a plugin theme. + * Property names map directly to the folds design-token contract. + */ +export interface PluginThemeColors { + background: ThemeColorGroup; + surface: ThemeColorGroup; + surfaceVariant: ThemeColorGroup; + primary: ThemePaletteGroup; + secondary: ThemePaletteGroup; + success: ThemePaletteGroup; + warning: ThemePaletteGroup; + critical: ThemePaletteGroup; + other: { + focusRing: string; + shadow: string; + overlay: string; + }; +} +/** + * Theme definition supplied by a plugin. + */ +export interface PluginTheme { + id: string; + name: string; + kind: 'light' | 'dark'; + colors: PluginThemeColors; + /** Optional extra CSS injected alongside the theme variables. */ + extraCss?: string; +} +/** + * A command argument definition. + */ +export interface CommandArg { + name: string; + type?: 'string' | 'number' | 'boolean'; + required?: boolean; + description?: string; +} +/** + * A command registered by a plugin. + */ +export interface PluginCommand { + name: string; + description?: string; + args?: string[] | CommandArg[]; + run: (args: Record, ctx: PluginContext) => string | void | Promise; +} +/** Callback invoked for outgoing or incoming messages. */ +export type MessageInterceptor = (msg: MessageContext) => void | Promise; +/** + * Message context passed to interceptors. + */ +export interface MessageContext { + content: string; + roomId: string; + eventType: string; + formatted?: string; + metadata?: Record; +} +/** + * Custom renderer function. + * The return type is `unknown` so the package stays framework-agnostic. + * Hosts using React should cast to `ReactNode` at the call-site. + */ +export type CustomRenderer = (data: unknown, defaultRenderer?: () => unknown) => unknown; +/** + * A single setting definition within a plugin's settings schema. + */ +export interface SettingDefinition { + type: 'string' | 'number' | 'boolean' | 'select' | 'color'; + label?: string; + description?: string; + default?: unknown; + options?: Array<{ + value: unknown; + label: string; + }>; +} +/** The full settings schema for a plugin. */ +export type SettingsSchema = Record; +/** + * Options for a notification emitted by a plugin. + */ +export interface NotificationOptions { + title: string; + body: string; + type?: 'info' | 'success' | 'error' | 'warning'; + duration?: number; + actions?: Array<{ + label: string; + action: () => void; + }>; +} +/** + * The context provided to plugins when they are initialized. + * All APIs are available through this object. + */ +export interface PluginContext { + /** Plugin ID */ + pluginId: string; + /** Commands API */ + commands: { + register: (command: PluginCommand) => void; + unregister: (name: string) => void; + execute: (name: string, args: Record) => Promise; + }; + /** Messages API */ + messages: { + onBeforeSend: (interceptor: MessageInterceptor) => void; + onReceive: (interceptor: MessageInterceptor) => void; + }; + /** UI API — framework-agnostic renderer registry */ + ui: { + registerRenderer: (type: string, renderer: CustomRenderer) => void; + unregisterRenderer: (type: string) => void; + }; + /** Settings API */ + settings: { + define: (schema: SettingsSchema) => void; + get: (key: string) => T | undefined; + set: (key: string, value: unknown) => void; + }; + /** Themes API */ + themes: { + register: (theme: PluginTheme) => void; + unregister: (themeId: string) => void; + }; + /** + * Generic event emitter API. + * Wire up any event client (Matrix, socket.io, Node EventEmitter, etc.) + * via the `eventClient` option passed to `createPluginContext`. + */ + events: { + on: (eventType: string, handler: (...args: any[]) => void) => void; + off: (eventType: string, handler: (...args: any[]) => void) => void; + }; + /** Background tasks API */ + timers: { + setInterval: (callback: () => void, ms: number) => number; + setTimeout: (callback: () => void, ms: number) => number; + clearInterval: (id: number) => void; + clearTimeout: (id: number) => void; + }; + /** Send a notification through the host application. */ + notify: (options: NotificationOptions | string) => void | Promise; + /** Logging API */ + log: (...args: any[]) => void; + warn: (...args: any[]) => void; + error: (...args: any[]) => void; + /** Require another loaded plugin's exports. */ + require: (pluginId: string) => unknown; +} +/** + * Custom settings section that a plugin can inject into the settings UI. + * The `component` value is `unknown` to remain framework-agnostic. + * Hosts using React should treat it as `ReactNode`. + */ +export interface PluginSettingsSection { + id: string; + name: string; + icon?: string; + component: unknown; +} +/** UI locations where plugins can inject content. */ +export type UILocation = 'room-header' | 'message-actions' | 'user-menu' | 'room-menu' | 'composer-actions'; +/** + * The main plugin interface that all plugins must implement. + */ +export interface Plugin { + name?: string; + version?: string; + dependencies?: Record; + /** Called when the plugin is loaded. */ + onLoad: (context: PluginContext) => void | Promise; + /** Called when the plugin is unloaded or disabled. */ + onUnload?: () => void | Promise; + /** Exposed API surface for other plugins to consume via `context.require()`. */ + exports?: unknown; +} +/** + * A single log entry produced by a plugin. + */ +export interface PluginLogEntry { + pluginId: string; + level: 'log' | 'warn' | 'error'; + timestamp: number; + args: unknown[]; +} +//# sourceMappingURL=PluginInterfaces.d.ts.map \ No newline at end of file diff --git a/dist/PluginInterfaces.d.ts.map b/dist/PluginInterfaces.d.ts.map new file mode 100644 index 0000000..6e0e677 --- /dev/null +++ b/dist/PluginInterfaces.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PluginInterfaces.d.ts","sourceRoot":"","sources":["../src/PluginInterfaces.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/PluginInterfaces.js b/dist/PluginInterfaces.js new file mode 100644 index 0000000..f191f7a --- /dev/null +++ b/dist/PluginInterfaces.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=PluginInterfaces.js.map \ No newline at end of file diff --git a/dist/PluginInterfaces.js.map b/dist/PluginInterfaces.js.map new file mode 100644 index 0000000..b7b2195 --- /dev/null +++ b/dist/PluginInterfaces.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PluginInterfaces.js","sourceRoot":"","sources":["../src/PluginInterfaces.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/PluginRegistry.d.ts b/dist/PluginRegistry.d.ts new file mode 100644 index 0000000..f80d6c9 --- /dev/null +++ b/dist/PluginRegistry.d.ts @@ -0,0 +1,122 @@ +import type { Plugin, PluginContext, PluginCommand, MessageInterceptor, MessageContext, CustomRenderer, SettingsSchema, PluginTheme, PluginLogEntry } from './PluginInterfaces.js'; +import type { IPluginStorage } from './interfaces.js'; +/** + * Configuration options for the PluginRegistry. + */ +export interface PluginRegistryOptions { + /** + * Storage adapter for persisting plugin settings. + * Defaults to in-memory storage if not provided. + * Pass `localStorage` (or a wrapper) for browser environments. + */ + storage?: IPluginStorage; + /** + * Called when a plugin registers a theme. + * The host is responsible for injecting the CSS into the document. + * Receives the full theme ID (used as the CSS class name) and the generated CSS string. + */ + onThemeRegistered?: (themeId: string, className: string, css: string) => void; + /** + * Called when a plugin unregisters a theme. + * The host is responsible for removing the injected CSS. + */ + onThemeUnregistered?: (themeId: string) => void; +} +/** + * Central registry that manages all loaded plugins and their side-effects. + * Create a single instance and share it across your application. + */ +export declare class PluginRegistry { + private readonly plugins; + private readonly commands; + private beforeSendInterceptors; + private receiveInterceptors; + private readonly renderers; + private readonly settingsSchemas; + private readonly pluginSettings; + private readonly matrixHandlers; + private readonly timers; + private readonly themes; + private logs; + private readonly maxLogs; + private readonly storage; + private readonly onThemeRegistered?; + private readonly onThemeUnregistered?; + constructor(options?: PluginRegistryOptions); + /** Register a plugin and its context. Called after the host has loaded the module. */ + registerPlugin(id: string, plugin: Plugin, context: PluginContext): void; + /** Unregister a plugin, calling its onUnload hook and cleaning up all side-effects. */ + unregisterPlugin(id: string): Promise; + /** Register a command contributed by a plugin. */ + registerCommand(pluginId: string, command: PluginCommand): void; + /** Remove a registered command by name. */ + unregisterCommand(name: string): void; + /** Execute a command by name, passing raw argument string. */ + executeCommand(name: string, rawArgs: string): Promise; + private parseCommandArgs; + /** Return all registered commands. */ + getCommands(): Array<{ + name: string; + pluginId: string; + command: PluginCommand; + }>; + /** Add a before-send interceptor for a plugin. */ + addBeforeSendInterceptor(pluginId: string, interceptor: MessageInterceptor): void; + /** Add a receive interceptor for a plugin. */ + addReceiveInterceptor(pluginId: string, interceptor: MessageInterceptor): void; + /** Run a message through all before-send interceptors in registration order. */ + processBeforeSend(msg: MessageContext): Promise; + /** Run a message through all receive interceptors in registration order. */ + processReceive(msg: MessageContext): Promise; + /** Register a custom renderer contributed by a plugin. */ + registerRenderer(pluginId: string, type: string, renderer: CustomRenderer): void; + /** Remove a renderer by type. */ + unregisterRenderer(type: string): void; + /** Get the renderer for a given type, if any. */ + getRenderer(type: string): CustomRenderer | undefined; + /** Define the settings schema for a plugin and load persisted values. */ + defineSettings(pluginId: string, schema: SettingsSchema): void; + /** Get a plugin setting value. */ + getPluginSetting(pluginId: string, key: string): T | undefined; + /** Set a plugin setting value and persist it. */ + setPluginSetting(pluginId: string, key: string, value: unknown): void; + /** Get the settings schema for a plugin. */ + getPluginSettingsSchema(pluginId: string): SettingsSchema | undefined; + /** Register a theme contributed by a plugin. */ + registerTheme(pluginId: string, theme: PluginTheme): void; + /** Unregister a theme contributed by a plugin. */ + unregisterTheme(pluginId: string, themeId: string): void; + /** Return all registered plugin themes. */ + getPluginThemes(): Array<{ + id: string; + name: string; + kind: 'light' | 'dark'; + className: string; + }>; + /** Track an event handler registered by a plugin. */ + addEventHandler(pluginId: string, eventType: string, handler: (...args: any[]) => void): void; + /** Remove a previously tracked event handler. */ + removeEventHandler(pluginId: string, eventType: string, handler: (...args: any[]) => void): void; + /** Get all tracked handlers for an event type. */ + getEventHandlers(eventType: string): Array<{ + pluginId: string; + handler: (...args: any[]) => void; + }>; + /** Track a timer ID for a plugin so it can be cleared on unload. */ + addTimer(pluginId: string, timerId: number): void; + /** Remove a timer ID from tracking (e.g. after manual clearInterval). */ + removeTimer(pluginId: string, timerId: number): void; + /** Append a log entry from a plugin. */ + addLog(pluginId: string, level: 'log' | 'warn' | 'error', args: unknown[]): void; + /** Return log entries, optionally filtered to a specific plugin. */ + getLogs(pluginId?: string): PluginLogEntry[]; + /** Clear log entries, optionally scoped to a specific plugin. */ + clearLogs(pluginId?: string): void; + /** Get the public exports of a loaded plugin. */ + getPluginExports(pluginId: string): unknown; + /** Unload the current plugin instance and load a new one in-place. */ + reloadPlugin(pluginId: string, newPlugin: Plugin, newContext: PluginContext): Promise; + /** Unload all plugins and clear all registry state. */ + clear(): void; +} +//# sourceMappingURL=PluginRegistry.d.ts.map \ No newline at end of file diff --git a/dist/PluginRegistry.d.ts.map b/dist/PluginRegistry.d.ts.map new file mode 100644 index 0000000..f78f1b1 --- /dev/null +++ b/dist/PluginRegistry.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PluginRegistry.d.ts","sourceRoot":"","sources":["../src/PluginRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,cAAc,EACd,WAAW,EACX,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,iBAAiB,CAAC;AAI1E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9E;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiE;IACzF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;IAC5F,OAAO,CAAC,sBAAsB,CAAoE;IAClG,OAAO,CAAC,mBAAmB,CAAoE;IAC/F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqE;IAC/F,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8C;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG3B;IACJ,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGnB;IACJ,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAA6C;IAChF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAA+C;gBAExE,OAAO,GAAE,qBAA0B;IAU/C,sFAAsF;IACtF,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IASxE,uFAAuF;IACjF,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDjD,kDAAkD;IAClD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAQ/D,2CAA2C;IAC3C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC,8DAA8D;IACxD,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW3E,OAAO,CAAC,gBAAgB;IAWxB,sCAAsC;IACtC,WAAW,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC;IAQhF,kDAAkD;IAClD,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,GAAG,IAAI;IAIjF,8CAA8C;IAC9C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,GAAG,IAAI;IAI9E,gFAAgF;IAC1E,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAYrE,4EAA4E;IACtE,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAgBlE,0DAA0D;IAC1D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAIhF,iCAAiC;IACjC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC,iDAAiD;IACjD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAQrD,yEAAyE;IACzE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IAmB9D,kCAAkC;IAClC,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI3E,iDAAiD;IACjD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAOrE,4CAA4C;IAC5C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAQrE,gDAAgD;IAChD,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAazD,kDAAkD;IAClD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQxD,2CAA2C;IAC3C,eAAe,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAajG,qDAAqD;IACrD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;IAO7F,iDAAiD;IACjD,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAChC,IAAI;IAQP,kDAAkD;IAClD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;IAQnG,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjD,yEAAyE;IACzE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IASpD,wCAAwC;IACxC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAOhF,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAI5C,iEAAiE;IACjE,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAQlC,iDAAiD;IACjD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQ3C,sEAAsE;IAChE,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjG,uDAAuD;IACvD,KAAK,IAAI,IAAI;CAgBd"} \ No newline at end of file diff --git a/dist/PluginRegistry.js b/dist/PluginRegistry.js new file mode 100644 index 0000000..c545f47 --- /dev/null +++ b/dist/PluginRegistry.js @@ -0,0 +1,335 @@ +import { MemoryStorage } from './interfaces.js'; +import { generateThemeCSS } from './theme-css.js'; +/** + * Central registry that manages all loaded plugins and their side-effects. + * Create a single instance and share it across your application. + */ +export class PluginRegistry { + constructor(options = {}) { + this.plugins = new Map(); + this.commands = new Map(); + this.beforeSendInterceptors = []; + this.receiveInterceptors = []; + this.renderers = new Map(); + this.settingsSchemas = new Map(); + this.pluginSettings = new Map(); + this.matrixHandlers = new Map(); + this.timers = new Map(); + this.themes = new Map(); + this.logs = []; + this.maxLogs = 1000; + this.storage = options.storage ?? new MemoryStorage(); + this.onThemeRegistered = options.onThemeRegistered; + this.onThemeUnregistered = options.onThemeUnregistered; + } + // --------------------------------------------------------------------------- + // Plugin lifecycle + // --------------------------------------------------------------------------- + /** Register a plugin and its context. Called after the host has loaded the module. */ + registerPlugin(id, plugin, context) { + if (this.plugins.has(id)) { + console.warn(`[PluginRegistry] Plugin ${id} is already registered`); + return; + } + this.plugins.set(id, { plugin, context }); + this.timers.set(id, []); + } + /** Unregister a plugin, calling its onUnload hook and cleaning up all side-effects. */ + async unregisterPlugin(id) { + const entry = this.plugins.get(id); + if (!entry) + return; + if (entry.plugin.onUnload) { + try { + await entry.plugin.onUnload(); + } + catch (err) { + console.error(`[PluginRegistry] Error unloading plugin ${id}:`, err); + } + } + for (const [cmdName, cmd] of this.commands.entries()) { + if (cmd.pluginId === id) + this.commands.delete(cmdName); + } + this.beforeSendInterceptors = this.beforeSendInterceptors.filter(i => i.pluginId !== id); + this.receiveInterceptors = this.receiveInterceptors.filter(i => i.pluginId !== id); + for (const [type, renderer] of this.renderers.entries()) { + if (renderer.pluginId === id) + this.renderers.delete(type); + } + for (const [themeId, theme] of this.themes.entries()) { + if (theme.pluginId === id) { + this.onThemeUnregistered?.(themeId); + this.themes.delete(themeId); + } + } + const timerIds = this.timers.get(id) ?? []; + timerIds.forEach(timerId => clearInterval(timerId)); + this.timers.delete(id); + for (const [eventType, handlers] of this.matrixHandlers.entries()) { + const filtered = handlers.filter(h => h.pluginId !== id); + if (filtered.length === 0) { + this.matrixHandlers.delete(eventType); + } + else { + this.matrixHandlers.set(eventType, filtered); + } + } + this.plugins.delete(id); + } + // --------------------------------------------------------------------------- + // Commands + // --------------------------------------------------------------------------- + /** Register a command contributed by a plugin. */ + registerCommand(pluginId, command) { + if (this.commands.has(command.name)) { + console.warn(`[PluginRegistry] Command /${command.name} already exists`); + return; + } + this.commands.set(command.name, { pluginId, command }); + } + /** Remove a registered command by name. */ + unregisterCommand(name) { + this.commands.delete(name); + } + /** Execute a command by name, passing raw argument string. */ + async executeCommand(name, rawArgs) { + const cmd = this.commands.get(name); + if (!cmd) + throw new Error(`Command /${name} not found`); + const args = this.parseCommandArgs(cmd.command, rawArgs); + const entry = this.plugins.get(cmd.pluginId); + if (!entry) + throw new Error(`Plugin ${cmd.pluginId} not loaded`); + return await cmd.command.run(args, entry.context); + } + parseCommandArgs(command, rawArgs) { + if (!command.args || command.args.length === 0) + return {}; + const parts = rawArgs.trim().split(/\s+/); + const result = {}; + command.args.forEach((arg, index) => { + const argName = typeof arg === 'string' ? arg : arg.name; + result[argName] = parts[index]; + }); + return result; + } + /** Return all registered commands. */ + getCommands() { + return Array.from(this.commands.entries()).map(([name, data]) => ({ name, ...data })); + } + // --------------------------------------------------------------------------- + // Message interceptors + // --------------------------------------------------------------------------- + /** Add a before-send interceptor for a plugin. */ + addBeforeSendInterceptor(pluginId, interceptor) { + this.beforeSendInterceptors.push({ pluginId, interceptor }); + } + /** Add a receive interceptor for a plugin. */ + addReceiveInterceptor(pluginId, interceptor) { + this.receiveInterceptors.push({ pluginId, interceptor }); + } + /** Run a message through all before-send interceptors in registration order. */ + async processBeforeSend(msg) { + let processed = { ...msg }; + for (const { interceptor } of this.beforeSendInterceptors) { + try { + await interceptor(processed); + } + catch (err) { + console.error('[PluginRegistry] Error in beforeSend interceptor:', err); + } + } + return processed; + } + /** Run a message through all receive interceptors in registration order. */ + async processReceive(msg) { + let processed = { ...msg }; + for (const { interceptor } of this.receiveInterceptors) { + try { + await interceptor(processed); + } + catch (err) { + console.error('[PluginRegistry] Error in receive interceptor:', err); + } + } + return processed; + } + // --------------------------------------------------------------------------- + // Renderers + // --------------------------------------------------------------------------- + /** Register a custom renderer contributed by a plugin. */ + registerRenderer(pluginId, type, renderer) { + this.renderers.set(type, { pluginId, renderer }); + } + /** Remove a renderer by type. */ + unregisterRenderer(type) { + this.renderers.delete(type); + } + /** Get the renderer for a given type, if any. */ + getRenderer(type) { + return this.renderers.get(type)?.renderer; + } + // --------------------------------------------------------------------------- + // Settings + // --------------------------------------------------------------------------- + /** Define the settings schema for a plugin and load persisted values. */ + defineSettings(pluginId, schema) { + this.settingsSchemas.set(pluginId, schema); + const stored = this.storage.getItem(`plugin:${pluginId}:settings`); + if (stored) { + try { + this.pluginSettings.set(pluginId, JSON.parse(stored)); + } + catch (err) { + console.error(`[PluginRegistry] Failed to load settings for ${pluginId}:`, err); + } + } + else { + const defaults = {}; + for (const [key, def] of Object.entries(schema)) { + if (def.default !== undefined) + defaults[key] = def.default; + } + this.pluginSettings.set(pluginId, defaults); + } + } + /** Get a plugin setting value. */ + getPluginSetting(pluginId, key) { + return this.pluginSettings.get(pluginId)?.[key]; + } + /** Set a plugin setting value and persist it. */ + setPluginSetting(pluginId, key, value) { + const settings = this.pluginSettings.get(pluginId) ?? {}; + settings[key] = value; + this.pluginSettings.set(pluginId, settings); + this.storage.setItem(`plugin:${pluginId}:settings`, JSON.stringify(settings)); + } + /** Get the settings schema for a plugin. */ + getPluginSettingsSchema(pluginId) { + return this.settingsSchemas.get(pluginId); + } + // --------------------------------------------------------------------------- + // Themes + // --------------------------------------------------------------------------- + /** Register a theme contributed by a plugin. */ + registerTheme(pluginId, theme) { + const fullId = `plugin-${pluginId}-${theme.id}`; + if (this.themes.has(fullId)) { + console.warn(`[PluginRegistry] Theme ${fullId} already registered`); + return; + } + const css = generateThemeCSS(fullId, theme); + this.themes.set(fullId, { pluginId, theme: { ...theme, id: fullId } }); + this.onThemeRegistered?.(fullId, fullId, css); + console.log(`[PluginRegistry] Theme registered: ${fullId}`); + } + /** Unregister a theme contributed by a plugin. */ + unregisterTheme(pluginId, themeId) { + const fullId = `plugin-${pluginId}-${themeId}`; + if (this.themes.has(fullId)) { + this.onThemeUnregistered?.(fullId); + this.themes.delete(fullId); + } + } + /** Return all registered plugin themes. */ + getPluginThemes() { + return Array.from(this.themes.values()).map(({ theme }) => ({ + id: theme.id, + name: theme.name, + kind: theme.kind, + className: theme.id, + })); + } + // --------------------------------------------------------------------------- + // Event handlers (generic — wire to Matrix, socket.io, etc.) + // --------------------------------------------------------------------------- + /** Track an event handler registered by a plugin. */ + addEventHandler(pluginId, eventType, handler) { + if (!this.matrixHandlers.has(eventType)) { + this.matrixHandlers.set(eventType, []); + } + this.matrixHandlers.get(eventType).push({ pluginId, handler }); + } + /** Remove a previously tracked event handler. */ + removeEventHandler(pluginId, eventType, handler) { + const handlers = this.matrixHandlers.get(eventType); + if (handlers) { + const filtered = handlers.filter(h => h.pluginId !== pluginId || h.handler !== handler); + this.matrixHandlers.set(eventType, filtered); + } + } + /** Get all tracked handlers for an event type. */ + getEventHandlers(eventType) { + return this.matrixHandlers.get(eventType) ?? []; + } + // --------------------------------------------------------------------------- + // Timers + // --------------------------------------------------------------------------- + /** Track a timer ID for a plugin so it can be cleared on unload. */ + addTimer(pluginId, timerId) { + const timers = this.timers.get(pluginId) ?? []; + timers.push(timerId); + this.timers.set(pluginId, timers); + } + /** Remove a timer ID from tracking (e.g. after manual clearInterval). */ + removeTimer(pluginId, timerId) { + const timers = this.timers.get(pluginId) ?? []; + this.timers.set(pluginId, timers.filter(id => id !== timerId)); + } + // --------------------------------------------------------------------------- + // Logging + // --------------------------------------------------------------------------- + /** Append a log entry from a plugin. */ + addLog(pluginId, level, args) { + this.logs.push({ pluginId, level, timestamp: Date.now(), args }); + if (this.logs.length > this.maxLogs) { + this.logs = this.logs.slice(-this.maxLogs); + } + } + /** Return log entries, optionally filtered to a specific plugin. */ + getLogs(pluginId) { + return pluginId ? this.logs.filter(l => l.pluginId === pluginId) : [...this.logs]; + } + /** Clear log entries, optionally scoped to a specific plugin. */ + clearLogs(pluginId) { + this.logs = pluginId ? this.logs.filter(l => l.pluginId !== pluginId) : []; + } + // --------------------------------------------------------------------------- + // Plugin exports (require()) + // --------------------------------------------------------------------------- + /** Get the public exports of a loaded plugin. */ + getPluginExports(pluginId) { + return this.plugins.get(pluginId)?.plugin.exports; + } + // --------------------------------------------------------------------------- + // Hot reload + // --------------------------------------------------------------------------- + /** Unload the current plugin instance and load a new one in-place. */ + async reloadPlugin(pluginId, newPlugin, newContext) { + await this.unregisterPlugin(pluginId); + this.registerPlugin(pluginId, newPlugin, newContext); + await newPlugin.onLoad(newContext); + } + // --------------------------------------------------------------------------- + // Teardown + // --------------------------------------------------------------------------- + /** Unload all plugins and clear all registry state. */ + clear() { + for (const pluginId of this.plugins.keys()) { + this.unregisterPlugin(pluginId).catch(err => { + console.error(`[PluginRegistry] Error clearing plugin ${pluginId}:`, err); + }); + } + this.plugins.clear(); + this.commands.clear(); + this.beforeSendInterceptors = []; + this.receiveInterceptors = []; + this.renderers.clear(); + this.settingsSchemas.clear(); + this.matrixHandlers.clear(); + this.timers.clear(); + this.logs = []; + } +} +//# sourceMappingURL=PluginRegistry.js.map \ No newline at end of file diff --git a/dist/PluginRegistry.js.map b/dist/PluginRegistry.js.map new file mode 100644 index 0000000..2a1e76b --- /dev/null +++ b/dist/PluginRegistry.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PluginRegistry.js","sourceRoot":"","sources":["../src/PluginRegistry.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..eb92355 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,11 @@ +export type { IPluginStorage, IPluginEventClient, } from './interfaces.js'; +export { MemoryStorage } from './interfaces.js'; +export type { PluginMetadata, PluginIndex, InstalledPlugin, } from './types.js'; +export { PluginTab } from './types.js'; +export type { ThemeColorGroup, ThemePaletteGroup, PluginThemeColors, PluginTheme, CommandArg, PluginCommand, MessageInterceptor, MessageContext, CustomRenderer, SettingDefinition, SettingsSchema, NotificationOptions, PluginContext, PluginSettingsSection, UILocation, Plugin, PluginLogEntry, } from './PluginInterfaces.js'; +export { generateThemeCSS } from './theme-css.js'; +export { PluginRegistry } from './PluginRegistry.js'; +export type { PluginRegistryOptions } from './PluginRegistry.js'; +export { createPluginContext } from './PluginContext.js'; +export type { PluginContextOptions } from './PluginContext.js'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map new file mode 100644 index 0000000..84b968d --- /dev/null +++ b/dist/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,YAAY,EACV,cAAc,EACd,WAAW,EACX,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..c92030b --- /dev/null +++ b/dist/index.js @@ -0,0 +1,6 @@ +export { MemoryStorage } from './interfaces.js'; +export { PluginTab } from './types.js'; +export { generateThemeCSS } from './theme-css.js'; +export { PluginRegistry } from './PluginRegistry.js'; +export { createPluginContext } from './PluginContext.js'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..5300d52 --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAsBvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"} \ No newline at end of file diff --git a/dist/interfaces.d.ts b/dist/interfaces.d.ts new file mode 100644 index 0000000..6313675 --- /dev/null +++ b/dist/interfaces.d.ts @@ -0,0 +1,27 @@ +/** + * Minimal key-value storage adapter. + * Pass `localStorage` in browser environments, or any Map-backed adapter for Node.js / tests. + */ +export interface IPluginStorage { + getItem(key: string): string | null; + setItem(key: string, value: string): void; +} +/** + * Minimal event emitter interface for the plugin events API. + * Compatible with Node.js EventEmitter, matrix-js-sdk MatrixClient, and similar clients. + */ +export interface IPluginEventClient { + on(event: string, handler: (...args: any[]) => void): void; + off(event: string, handler: (...args: any[]) => void): void; +} +/** + * In-memory storage implementation — used as the default when no storage adapter is provided. + */ +export declare class MemoryStorage implements IPluginStorage { + private readonly store; + /** @inheritdoc */ + getItem(key: string): string | null; + /** @inheritdoc */ + setItem(key: string, value: string): void; +} +//# sourceMappingURL=interfaces.d.ts.map \ No newline at end of file diff --git a/dist/interfaces.d.ts.map b/dist/interfaces.d.ts.map new file mode 100644 index 0000000..bd0172e --- /dev/null +++ b/dist/interfaces.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC7D;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEnD,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAInC,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAG1C"} \ No newline at end of file diff --git a/dist/interfaces.js b/dist/interfaces.js new file mode 100644 index 0000000..f6ed4be --- /dev/null +++ b/dist/interfaces.js @@ -0,0 +1,17 @@ +/** + * In-memory storage implementation — used as the default when no storage adapter is provided. + */ +export class MemoryStorage { + constructor() { + this.store = new Map(); + } + /** @inheritdoc */ + getItem(key) { + return this.store.get(key) ?? null; + } + /** @inheritdoc */ + setItem(key, value) { + this.store.set(key, value); + } +} +//# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/interfaces.js.map b/dist/interfaces.js.map new file mode 100644 index 0000000..1d56485 --- /dev/null +++ b/dist/interfaces.js.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,OAAO,aAAa;IAA1B;QACmB,UAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAWrD,CAAC;IATC,kBAAkB;IAClB,OAAO,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAW,EAAE,KAAa;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF"} \ No newline at end of file diff --git a/dist/theme-css.d.ts b/dist/theme-css.d.ts new file mode 100644 index 0000000..e23656c --- /dev/null +++ b/dist/theme-css.d.ts @@ -0,0 +1,11 @@ +import type { PluginTheme } from './PluginInterfaces.js'; +/** + * Generates a CSS block that overrides the folds vanilla-extract design tokens + * for a given theme class name. + * + * NOTE: The `--oq6d07*` variable names are stable compiled identifiers for the + * version of the `folds` design system used in Paarrot. They will need updating + * if folds is upgraded to a version that recompiles its theme contract. + */ +export declare function generateThemeCSS(className: string, theme: PluginTheme): string; +//# sourceMappingURL=theme-css.d.ts.map \ No newline at end of file diff --git a/dist/theme-css.d.ts.map b/dist/theme-css.d.ts.map new file mode 100644 index 0000000..8c28470 --- /dev/null +++ b/dist/theme-css.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"theme-css.d.ts","sourceRoot":"","sources":["../src/theme-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAsF9E"} \ No newline at end of file diff --git a/dist/theme-css.js b/dist/theme-css.js new file mode 100644 index 0000000..469ccc7 --- /dev/null +++ b/dist/theme-css.js @@ -0,0 +1,84 @@ +/** + * Generates a CSS block that overrides the folds vanilla-extract design tokens + * for a given theme class name. + * + * NOTE: The `--oq6d07*` variable names are stable compiled identifiers for the + * version of the `folds` design system used in Paarrot. They will need updating + * if folds is upgraded to a version that recompiles its theme contract. + */ +export function generateThemeCSS(className, theme) { + const { background: bg, surface: sf, surfaceVariant: sv, primary: pr, secondary: sc, success: su, warning: wa, critical: cr, other: ot, } = theme.colors; + const vars = ` + .${className} { + --oq6d070: ${bg.container}; + --oq6d071: ${bg.containerHover}; + --oq6d072: ${bg.containerActive}; + --oq6d073: ${bg.containerLine}; + --oq6d074: ${bg.onContainer}; + --oq6d075: ${sf.container}; + --oq6d076: ${sf.containerHover}; + --oq6d077: ${sf.containerActive}; + --oq6d078: ${sf.containerLine}; + --oq6d079: ${sf.onContainer}; + --oq6d07a: ${sv.container}; + --oq6d07b: ${sv.containerHover}; + --oq6d07c: ${sv.containerActive}; + --oq6d07d: ${sv.containerLine}; + --oq6d07e: ${sv.onContainer}; + --oq6d07f: ${pr.main}; + --oq6d07g: ${pr.mainHover}; + --oq6d07h: ${pr.mainActive}; + --oq6d07i: ${pr.mainLine}; + --oq6d07j: ${pr.onMain}; + --oq6d07k: ${pr.container}; + --oq6d07l: ${pr.containerHover}; + --oq6d07m: ${pr.containerActive}; + --oq6d07n: ${pr.containerLine}; + --oq6d07o: ${pr.onContainer}; + --oq6d07p: ${sc.main}; + --oq6d07q: ${sc.mainHover}; + --oq6d07r: ${sc.mainActive}; + --oq6d07s: ${sc.mainLine}; + --oq6d07t: ${sc.onMain}; + --oq6d07u: ${sc.container}; + --oq6d07v: ${sc.containerHover}; + --oq6d07w: ${sc.containerActive}; + --oq6d07x: ${sc.containerLine}; + --oq6d07y: ${sc.onContainer}; + --oq6d07z: ${su.main}; + --oq6d0710: ${su.mainHover}; + --oq6d0711: ${su.mainActive}; + --oq6d0712: ${su.mainLine}; + --oq6d0713: ${su.onMain}; + --oq6d0714: ${su.container}; + --oq6d0715: ${su.containerHover}; + --oq6d0716: ${su.containerActive}; + --oq6d0717: ${su.containerLine}; + --oq6d0718: ${su.onContainer}; + --oq6d0719: ${wa.main}; + --oq6d071a: ${wa.mainHover}; + --oq6d071b: ${wa.mainActive}; + --oq6d071c: ${wa.mainLine}; + --oq6d071d: ${wa.onMain}; + --oq6d071e: ${wa.container}; + --oq6d071f: ${wa.containerHover}; + --oq6d071g: ${wa.containerActive}; + --oq6d071h: ${wa.containerLine}; + --oq6d071i: ${wa.onContainer}; + --oq6d071j: ${cr.main}; + --oq6d071k: ${cr.mainHover}; + --oq6d071l: ${cr.mainActive}; + --oq6d071m: ${cr.mainLine}; + --oq6d071n: ${cr.onMain}; + --oq6d071o: ${cr.container}; + --oq6d071p: ${cr.containerHover}; + --oq6d071q: ${cr.containerActive}; + --oq6d071r: ${cr.containerLine}; + --oq6d071s: ${cr.onContainer}; + --oq6d071t: ${ot.focusRing}; + --oq6d071u: ${ot.shadow}; + --oq6d071v: ${ot.overlay}; + }`; + return theme.extraCss ? `${vars}\n${theme.extraCss}` : vars; +} +//# sourceMappingURL=theme-css.js.map \ No newline at end of file diff --git a/dist/theme-css.js.map b/dist/theme-css.js.map new file mode 100644 index 0000000..bae99d5 --- /dev/null +++ b/dist/theme-css.js.map @@ -0,0 +1 @@ +{"version":3,"file":"theme-css.js","sourceRoot":"","sources":["../src/theme-css.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,KAAkB;IACpE,MAAM,EACJ,UAAU,EAAE,EAAE,EACd,OAAO,EAAE,EAAE,EACX,cAAc,EAAE,EAAE,EAClB,OAAO,EAAE,EAAE,EACX,SAAS,EAAE,EAAE,EACb,OAAO,EAAE,EAAE,EACX,OAAO,EAAE,EAAE,EACX,QAAQ,EAAE,EAAE,EACZ,KAAK,EAAE,EAAE,GACV,GAAG,KAAK,CAAC,MAAM,CAAC;IAEjB,MAAM,IAAI,GAAG;KACV,SAAS;iBACG,EAAE,CAAC,SAAS;iBACZ,EAAE,CAAC,cAAc;iBACjB,EAAE,CAAC,eAAe;iBAClB,EAAE,CAAC,aAAa;iBAChB,EAAE,CAAC,WAAW;iBACd,EAAE,CAAC,SAAS;iBACZ,EAAE,CAAC,cAAc;iBACjB,EAAE,CAAC,eAAe;iBAClB,EAAE,CAAC,aAAa;iBAChB,EAAE,CAAC,WAAW;iBACd,EAAE,CAAC,SAAS;iBACZ,EAAE,CAAC,cAAc;iBACjB,EAAE,CAAC,eAAe;iBAClB,EAAE,CAAC,aAAa;iBAChB,EAAE,CAAC,WAAW;iBACd,EAAE,CAAC,IAAI;iBACP,EAAE,CAAC,SAAS;iBACZ,EAAE,CAAC,UAAU;iBACb,EAAE,CAAC,QAAQ;iBACX,EAAE,CAAC,MAAM;iBACT,EAAE,CAAC,SAAS;iBACZ,EAAE,CAAC,cAAc;iBACjB,EAAE,CAAC,eAAe;iBAClB,EAAE,CAAC,aAAa;iBAChB,EAAE,CAAC,WAAW;iBACd,EAAE,CAAC,IAAI;iBACP,EAAE,CAAC,SAAS;iBACZ,EAAE,CAAC,UAAU;iBACb,EAAE,CAAC,QAAQ;iBACX,EAAE,CAAC,MAAM;iBACT,EAAE,CAAC,SAAS;iBACZ,EAAE,CAAC,cAAc;iBACjB,EAAE,CAAC,eAAe;iBAClB,EAAE,CAAC,aAAa;iBAChB,EAAE,CAAC,WAAW;iBACd,EAAE,CAAC,IAAI;kBACN,EAAE,CAAC,SAAS;kBACZ,EAAE,CAAC,UAAU;kBACb,EAAE,CAAC,QAAQ;kBACX,EAAE,CAAC,MAAM;kBACT,EAAE,CAAC,SAAS;kBACZ,EAAE,CAAC,cAAc;kBACjB,EAAE,CAAC,eAAe;kBAClB,EAAE,CAAC,aAAa;kBAChB,EAAE,CAAC,WAAW;kBACd,EAAE,CAAC,IAAI;kBACP,EAAE,CAAC,SAAS;kBACZ,EAAE,CAAC,UAAU;kBACb,EAAE,CAAC,QAAQ;kBACX,EAAE,CAAC,MAAM;kBACT,EAAE,CAAC,SAAS;kBACZ,EAAE,CAAC,cAAc;kBACjB,EAAE,CAAC,eAAe;kBAClB,EAAE,CAAC,aAAa;kBAChB,EAAE,CAAC,WAAW;kBACd,EAAE,CAAC,IAAI;kBACP,EAAE,CAAC,SAAS;kBACZ,EAAE,CAAC,UAAU;kBACb,EAAE,CAAC,QAAQ;kBACX,EAAE,CAAC,MAAM;kBACT,EAAE,CAAC,SAAS;kBACZ,EAAE,CAAC,cAAc;kBACjB,EAAE,CAAC,eAAe;kBAClB,EAAE,CAAC,aAAa;kBAChB,EAAE,CAAC,WAAW;kBACd,EAAE,CAAC,SAAS;kBACZ,EAAE,CAAC,MAAM;kBACT,EAAE,CAAC,OAAO;IACxB,CAAC;IAEH,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC"} \ No newline at end of file diff --git a/dist/types.d.ts b/dist/types.d.ts new file mode 100644 index 0000000..f4d2c65 --- /dev/null +++ b/dist/types.d.ts @@ -0,0 +1,37 @@ +/** + * Plugin metadata as returned by the marketplace / plugin directory. + */ +export interface PluginMetadata { + id: string; + name: string; + version: string; + description: string; + author: string; + repository: string; + thumbnail: string; + downloadUrl: string; + homepage: string; + tags: string[]; + addedDate: string; +} +/** + * Plugin directory index response from the marketplace. + */ +export interface PluginIndex { + version: string; + updatedAt: string; + plugins: string[]; +} +/** + * An installed plugin — extends metadata with runtime state. + */ +export interface InstalledPlugin extends PluginMetadata { + installedDate: string; + enabled: boolean; +} +/** Tab identifiers for the plugin manager UI. */ +export declare enum PluginTab { + Marketplace = "marketplace", + Installed = "installed" +} +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/types.d.ts.map b/dist/types.d.ts.map new file mode 100644 index 0000000..915ae30 --- /dev/null +++ b/dist/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,iDAAiD;AACjD,oBAAY,SAAS;IACnB,WAAW,gBAAgB;IAC3B,SAAS,cAAc;CACxB"} \ No newline at end of file diff --git a/dist/types.js b/dist/types.js new file mode 100644 index 0000000..0fa3d83 --- /dev/null +++ b/dist/types.js @@ -0,0 +1,7 @@ +/** Tab identifiers for the plugin manager UI. */ +export var PluginTab; +(function (PluginTab) { + PluginTab["Marketplace"] = "marketplace"; + PluginTab["Installed"] = "installed"; +})(PluginTab || (PluginTab = {})); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/types.js.map b/dist/types.js.map new file mode 100644 index 0000000..d6de08d --- /dev/null +++ b/dist/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkCA,iDAAiD;AACjD,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,wCAA2B,CAAA;IAC3B,oCAAuB,CAAA;AACzB,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB"} \ No newline at end of file