{"version":3,"file":"plugin-system.mjs","names":[],"sources":["../../../../../../../@warlock.js/seal/src/plugins/plugin-system.ts"],"sourcesContent":["/**\r\n * Seal Plugin System\r\n *\r\n * Allows extending validators with custom functionality via plugins\r\n */\r\n\r\nexport type PluginContext = {\r\n  /** Plugin name */\r\n  name: string;\r\n  /** Plugin version */\r\n  version?: string;\r\n};\r\n\r\nexport type SealPlugin = {\r\n  /** Plugin metadata */\r\n  name: string;\r\n  version?: string;\r\n  description?: string;\r\n\r\n  /**\r\n   * Install function - called when plugin is registered\r\n   * This is where you inject methods into validators\r\n   *\r\n   * @example\r\n   * ```ts\r\n   * install() {\r\n   *   Object.assign(StringValidator.prototype, {\r\n   *     slug(this: StringValidator) {\r\n   *       return this.pattern(/^[a-z0-9-]+$/);\r\n   *     }\r\n   *   });\r\n   * }\r\n   * ```\r\n   */\r\n  install: (context: PluginContext) => void | Promise<void>;\r\n\r\n  /**\r\n   * Uninstall the plugin (optional)\r\n   * Clean up any injected methods\r\n   */\r\n  uninstall?: () => void | Promise<void>;\r\n};\r\n\r\n/**\r\n * Registry of installed plugins\r\n */\r\nconst installedPlugins = new Map<string, SealPlugin>();\r\n\r\n/**\r\n * Register a plugin\r\n *\r\n * @example\r\n * ```ts\r\n * const slugPlugin: SealPlugin = {\r\n *   name: \"slug\",\r\n *   install() {\r\n *     Object.assign(StringValidator.prototype, {\r\n *       slug(this: StringValidator) {\r\n *         return this.pattern(/^[a-z0-9-]+$/);\r\n *       }\r\n *     });\r\n *   }\r\n * };\r\n *\r\n * registerPlugin(slugPlugin);\r\n * ```\r\n */\r\nexport async function registerPlugin(plugin: SealPlugin): Promise<void> {\r\n  if (installedPlugins.has(plugin.name)) {\r\n    console.warn(`[Seal] Plugin \"${plugin.name}\" is already installed`);\r\n    return;\r\n  }\r\n\r\n  const context: PluginContext = {\r\n    name: plugin.name,\r\n    version: plugin.version,\r\n  };\r\n\r\n  // Call install function\r\n  await plugin.install(context);\r\n\r\n  installedPlugins.set(plugin.name, plugin);\r\n}\r\n\r\n/**\r\n * Unregister a plugin\r\n */\r\nexport async function unregisterPlugin(pluginName: string): Promise<void> {\r\n  const plugin = installedPlugins.get(pluginName);\r\n\r\n  if (!plugin) {\r\n    console.warn(`[Seal] Plugin \"${pluginName}\" is not installed`);\r\n    return;\r\n  }\r\n\r\n  if (plugin.uninstall) {\r\n    await plugin.uninstall();\r\n  }\r\n\r\n  installedPlugins.delete(pluginName);\r\n}\r\n\r\n/**\r\n * Check if a plugin is installed\r\n */\r\nexport function hasPlugin(pluginName: string): boolean {\r\n  return installedPlugins.has(pluginName);\r\n}\r\n\r\n/**\r\n * Get list of installed plugins\r\n */\r\nexport function getInstalledPlugins(): SealPlugin[] {\r\n  return Array.from(installedPlugins.values());\r\n}\r\n"],"mappings":";;;;AA8CA,MAAM,mCAAmB,IAAI,IAAwB;;;;;;;;;;;;;;;;;;;;AAqBrD,eAAsB,eAAe,QAAmC;CACtE,IAAI,iBAAiB,IAAI,OAAO,IAAI,GAAG;EACrC,QAAQ,KAAK,kBAAkB,OAAO,KAAK,uBAAuB;EAClE;CACF;CAEA,MAAM,UAAyB;EAC7B,MAAM,OAAO;EACb,SAAS,OAAO;CAClB;CAGA,MAAM,OAAO,QAAQ,OAAO;CAE5B,iBAAiB,IAAI,OAAO,MAAM,MAAM;AAC1C;;;;AAKA,eAAsB,iBAAiB,YAAmC;CACxE,MAAM,SAAS,iBAAiB,IAAI,UAAU;CAE9C,IAAI,CAAC,QAAQ;EACX,QAAQ,KAAK,kBAAkB,WAAW,mBAAmB;EAC7D;CACF;CAEA,IAAI,OAAO,WACT,MAAM,OAAO,UAAU;CAGzB,iBAAiB,OAAO,UAAU;AACpC;;;;AAKA,SAAgB,UAAU,YAA6B;CACrD,OAAO,iBAAiB,IAAI,UAAU;AACxC;;;;AAKA,SAAgB,sBAAoC;CAClD,OAAO,MAAM,KAAK,iBAAiB,OAAO,CAAC;AAC7C"}