@nbreak/core 0.1.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/LICENSE +34 -0
- package/README.md +3 -0
- package/dist/cjs/index.cjs +831 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/esm/index.js +786 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["ALL_EXTENSION_TYPES","HOOK_NAMES","EXTENSION_STATUS","EXTENSION_TYPES"],"sources":["../../src/pluginSystem.js","../../src/eventBus.js","../../src/extensionRegistry.js","../../src/index.js"],"sourcesContent":["/**\n * @nbreak/core - 插件系统\n *\n * 升级自现有 src/core/pluginSystem.js,保留 hooks 机制并扩展:\n * - 增加中间件支持(hook 前后置拦截)\n * - 增加钩子结果聚合策略\n * - 与 ExtensionRegistry 协同\n */\n\nimport { deepClone } from '@nbreak/shared';\n\n/**\n * 钩子聚合策略\n */\nexport const HOOK_AGGREGATE_STRATEGIES = {\n /** 后者覆盖前者(默认,pipe 风格) */\n PIPE: 'pipe',\n /** 收集所有结果为数组 */\n COLLECT: 'collect',\n /** 取第一个非空结果 */\n FIRST: 'first',\n /** 取最后一个非空结果 */\n LAST: 'last',\n /** 并行执行,结果为数组(无序) */\n PARALLEL: 'parallel',\n};\n\nclass PluginSystem {\n constructor() {\n this.plugins = new Map(); // pluginName -> plugin\n this.hooks = new Map(); // hookName -> [{ pluginName, handler, priority, options }]\n this.middlewares = []; // 全局中间件链\n }\n\n /**\n * 注册插件\n * @param {Object} plugin - 插件定义\n * @param {string} plugin.name - 插件名称(唯一)\n * @param {Function} plugin.install - 安装函数 (api) => {}\n * @param {Function} [plugin.uninstall] - 卸载函数\n */\n register(plugin) {\n if (!plugin || !plugin.name) {\n console.warn('[DataScreen] 插件注册失败:缺少 name 字段');\n return this;\n }\n if (this.plugins.has(plugin.name)) {\n console.warn(`[DataScreen] 插件 \"${plugin.name}\" 已注册,跳过`);\n return this;\n }\n\n const api = this._createPluginApi(plugin.name);\n if (typeof plugin.install === 'function') {\n try {\n plugin.install(api);\n } catch (e) {\n console.error(`[DataScreen] 插件 \"${plugin.name}\" 安装失败:`, e);\n }\n }\n this.plugins.set(plugin.name, { ...plugin, api });\n return this;\n }\n\n /**\n * 注入钩子(按优先级顺序执行)\n * @param {string} hookName - 钩子名称\n * @param {Object} [context={}] - 上下文数据\n * @param {Object} [options] - 执行选项\n * @param {string} [options.strategy] - 聚合策略\n * @returns {*} 钩子执行结果\n */\n async callHook(hookName, context = {}, options = {}) {\n const handlers = this.hooks.get(hookName) || [];\n const sorted = [...handlers].sort((a, b) => a.priority - b.priority);\n\n const strategy = options.strategy || HOOK_AGGREGATE_STRATEGIES.PIPE;\n\n // 全局中间件前置\n let processedContext = context;\n for (const mw of this.middlewares) {\n if (mw.before) {\n try {\n processedContext = await mw.before(hookName, processedContext);\n } catch (e) {\n console.error(`[DataScreen] 中间件 before 错误 (${hookName}):`, e);\n }\n }\n }\n\n if (strategy === HOOK_AGGREGATE_STRATEGIES.COLLECT ||\n strategy === HOOK_AGGREGATE_STRATEGIES.PARALLEL) {\n // 收集/并行模式\n if (strategy === HOOK_AGGREGATE_STRATEGIES.PARALLEL) {\n const results = await Promise.allSettled(\n sorted.map(h => Promise.resolve(h.handler(deepClone(processedContext))))\n );\n return results.map(r => r.status === 'fulfilled' ? r.value : null);\n }\n const collected = [];\n for (const handler of sorted) {\n try {\n const result = await handler.handler(deepClone(processedContext));\n collected.push(result);\n } catch (e) {\n console.error(`[DataScreen] Hook \"${hookName}\" 错误 (${handler.pluginName}):`, e);\n }\n }\n return collected;\n }\n\n if (strategy === HOOK_AGGREGATE_STRATEGIES.FIRST) {\n for (const handler of sorted) {\n try {\n const result = await handler.handler(deepClone(processedContext));\n if (result !== undefined && result !== null) return result;\n } catch (e) {\n console.error(`[DataScreen] Hook \"${hookName}\" 错误 (${handler.pluginName}):`, e);\n }\n }\n return undefined;\n }\n\n if (strategy === HOOK_AGGREGATE_STRATEGIES.LAST) {\n let lastResult;\n for (const handler of sorted) {\n try {\n const result = await handler.handler(deepClone(processedContext));\n if (result !== undefined && result !== null) lastResult = result;\n } catch (e) {\n console.error(`[DataScreen] Hook \"${hookName}\" 错误 (${handler.pluginName}):`, e);\n }\n }\n return lastResult;\n }\n\n // 默认 PIPE 模式\n let result = processedContext;\n for (const handler of sorted) {\n try {\n result = await handler.handler(result);\n } catch (e) {\n console.error(`[DataScreen] Hook \"${hookName}\" 错误 (${handler.pluginName}):`, e);\n }\n }\n\n // 全局中间件后置\n for (const mw of this.middlewares) {\n if (mw.after) {\n try {\n result = await mw.after(hookName, result);\n } catch (e) {\n console.error(`[DataScreen] 中间件 after 错误 (${hookName}):`, e);\n }\n }\n }\n\n return result;\n }\n\n /**\n * 同步注入钩子(不等待 Promise)\n * @param {string} hookName\n * @param {Object} [context={}]\n * @returns {Object}\n */\n callHookSync(hookName, context = {}) {\n const handlers = this.hooks.get(hookName) || [];\n const sorted = [...handlers].sort((a, b) => a.priority - b.priority);\n let result = context;\n for (const handler of sorted) {\n try {\n const ret = handler.handler(result);\n if (ret !== undefined) result = ret;\n } catch (e) {\n console.error(`[DataScreen] Hook sync \"${hookName}\" 错误 (${handler.pluginName}):`, e);\n }\n }\n return result;\n }\n\n /**\n * 添加全局中间件\n * @param {Object} middleware\n * @param {Function} [middleware.before]\n * @param {Function} [middleware.after]\n */\n use(middleware) {\n if (middleware && (middleware.before || middleware.after)) {\n this.middlewares.push(middleware);\n }\n return this;\n }\n\n /**\n * 获取所有已注册插件\n */\n getPlugins() {\n return Array.from(this.plugins.values());\n }\n\n /**\n * 获取插件\n */\n getPlugin(name) {\n return this.plugins.get(name);\n }\n\n /**\n * 检查插件是否已注册\n */\n hasPlugin(name) {\n return this.plugins.has(name);\n }\n\n /**\n * 获取所有钩子名\n */\n getHookNames() {\n return Array.from(this.hooks.keys());\n }\n\n /**\n * 获取某个钩子的处理器数量\n */\n getHookHandlerCount(hookName) {\n return (this.hooks.get(hookName) || []).length;\n }\n\n /**\n * 卸载插件\n */\n unregister(name) {\n const plugin = this.plugins.get(name);\n if (plugin && typeof plugin.uninstall === 'function') {\n try {\n plugin.uninstall();\n } catch (e) {\n console.error(`[DataScreen] 插件 \"${name}\" 卸载失败:`, e);\n }\n }\n this.plugins.delete(name);\n this.hooks.forEach((handlers, hookName) => {\n this.hooks.set(hookName, handlers.filter(h => h.pluginName !== name));\n });\n return this;\n }\n\n /**\n * 清空所有插件与钩子\n */\n clear() {\n this.plugins.clear();\n this.hooks.clear();\n this.middlewares = [];\n return this;\n }\n\n /**\n * 为插件创建 API 对象\n */\n _createPluginApi(pluginName) {\n return {\n pluginName,\n\n /**\n * 注册钩子处理器\n * @param {string} hookName\n * @param {Function} handler\n * @param {number} [priority=100] - 优先级(越小越先执行)\n */\n hook: (hookName, handler, priority = 100) => {\n if (typeof handler !== 'function') {\n console.warn(`[DataScreen] 插件 \"${pluginName}\" 注册钩子 \"${hookName}\" 失败:handler 不是函数`);\n return;\n }\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, []);\n }\n this.hooks.get(hookName).push({ pluginName, handler, priority });\n },\n\n /**\n * 注册多个钩子\n * @param {Object} hooks - { hookName: handler }\n */\n hooks: (hooks = {}) => {\n Object.entries(hooks).forEach(([hookName, handler]) => {\n if (typeof handler === 'function') {\n this._createPluginApi(pluginName).hook(hookName, handler);\n }\n });\n },\n\n /**\n * 获取已注册插件\n */\n getPlugin: (name) => this.plugins.get(name),\n\n /**\n * 获取所有插件\n */\n getPlugins: () => Array.from(this.plugins.values()),\n };\n }\n}\n\n// 全局单例\nexport const pluginSystem = new PluginSystem();\nexport default PluginSystem;\nexport { PluginSystem };\n","/**\n * @nbreak/core - 事件总线(统一版)\n *\n * 合并原 core 与 app(interactions/EventBus) 两套实现,作为唯一事件总线:\n * - 标准 on/off/once/emit(同步触发,双参 handler(data, meta))\n * - emitSync 别名 / emitAsync 异步触发(await handler 返回的 Promise)\n * - 通配符订阅(component:*)+ 命名空间级通配(user:*)\n * - 优先级排序、命名空间隔离、createNamespace 子总线\n * - waitFor(Promise 风格等待事件)\n * - clearEvent / clearNamespace / offNamespace / clear\n * - listenerCount / eventNames / getEvents / getNamespaces\n */\n\n/**\n * 事件总线类\n */\nexport class EventBus {\n constructor() {\n this.events = new Map(); // eventKey -> listener[]\n this.namespaces = new Map(); // namespace -> Set<eventKey>\n this.wildcardListeners = []; // { pattern, regex, callback, priority }\n }\n\n /**\n * 解析事件名称,提取命名空间\n * @param {string} event - 事件名称 (如: 'user:login', 'data:update')\n * @returns {{ event: string, namespace: string|null, action: string }}\n */\n parseEventName(event) {\n const parts = event.split(':');\n return {\n event,\n namespace: parts.length > 1 ? parts[0] : null,\n action: parts.length > 1 ? parts.slice(1).join(':') : event,\n };\n }\n\n /**\n * 订阅事件\n * @param {string} event - 事件名称,支持通配符(如 'component:*')与命名空间\n * @param {Function} callback - 回调函数 (data, meta) => void\n * @param {Object} [options]\n * @param {string} [options.namespace] - 命名空间\n * @param {number} [options.priority] - 优先级(数字越大越先执行)\n * @returns {Function} 取消订阅函数\n */\n on(event, callback, options = {}) {\n if (typeof callback !== 'function') {\n console.warn('[EventBus] callback 必须是函数');\n return () => {};\n }\n const { namespace, priority = 0 } = options;\n const eventKey = namespace ? `${namespace}:${event}` : event;\n\n // 通配符事件单独存储\n if (event.includes('*')) {\n this.wildcardListeners.push({\n pattern: event,\n regex: new RegExp('^' + event.replace(/\\*/g, '.*') + '$'),\n callback,\n priority,\n });\n return () => this.offWildcard(callback);\n }\n\n if (!this.events.has(eventKey)) {\n this.events.set(eventKey, []);\n }\n const listeners = this.events.get(eventKey);\n const listener = { callback, priority, namespace };\n\n // 按优先级插入(高优先级在前)\n const insertIndex = listeners.findIndex((l) => l.priority < priority);\n if (insertIndex === -1) {\n listeners.push(listener);\n } else {\n listeners.splice(insertIndex, 0, listener);\n }\n\n // 命名空间记录\n if (namespace) {\n if (!this.namespaces.has(namespace)) {\n this.namespaces.set(namespace, new Set());\n }\n this.namespaces.get(namespace).add(eventKey);\n }\n\n return () => this.off(eventKey, callback);\n }\n\n /**\n * 订阅事件(只触发一次)\n */\n once(event, callback, options = {}) {\n const { namespace } = options;\n const eventKey = namespace ? `${namespace}:${event}` : event;\n const wrapper = (data, meta) => {\n callback(data, meta);\n this.off(eventKey, wrapper);\n };\n return this.on(event, wrapper, options);\n }\n\n /**\n * 取消订阅\n * @param {string} event - 事件名称(或 eventKey)\n * @param {Function} callback - 回调函数;省略则清空该事件所有订阅\n */\n off(event, callback) {\n const listeners = this.events.get(event);\n if (listeners) {\n if (callback) {\n const index = listeners.findIndex((l) => l.callback === callback);\n if (index > -1) listeners.splice(index, 1);\n if (listeners.length === 0) this.events.delete(event);\n } else {\n this.events.delete(event);\n }\n }\n return this;\n }\n\n /**\n * 取消通配符订阅\n */\n offWildcard(callback) {\n const index = this.wildcardListeners.findIndex((l) => l.callback === callback);\n if (index > -1) this.wildcardListeners.splice(index, 1);\n return this;\n }\n\n /**\n * 同步触发事件(默认行为)\n *\n * handler 接收双参:(data, meta)\n * meta 包含 { timestamp, event, namespace }\n *\n * @param {string} event - 事件名称\n * @param {*} [data] - 事件数据\n * @param {Object} [meta] - 额外元数据\n */\n emit(event, data, meta = {}) {\n const timestamp = Date.now();\n const eventInfo = this.parseEventName(event);\n const fullMeta = { ...meta, timestamp, event, namespace: eventInfo.namespace };\n\n // 精确匹配\n const listeners = this.events.get(event);\n if (listeners) {\n [...listeners].forEach(({ callback }) => {\n try {\n callback(data, fullMeta);\n } catch (e) {\n console.error(`[EventBus] 事件 \"${event}\" 处理错误:`, e);\n }\n });\n }\n\n // 通配符监听器\n this.wildcardListeners.forEach(({ regex, callback }) => {\n if (regex.test(event)) {\n try {\n callback(data, fullMeta);\n } catch (e) {\n console.error(`[EventBus] 通配事件 \"${event}\" 处理错误:`, e);\n }\n }\n });\n\n // 命名空间级通配(user:* 匹配 user:login)\n if (eventInfo.namespace) {\n const nsListeners = this.events.get(`${eventInfo.namespace}:*`);\n if (nsListeners) {\n [...nsListeners].forEach(({ callback }) => {\n try {\n callback(data, fullMeta);\n } catch (e) {\n console.error(`[EventBus] 命名空间事件 \"${event}\" 处理错误:`, e);\n }\n });\n }\n }\n }\n\n /**\n * 同步触发(emit 的别名,保持向后兼容)\n */\n emitSync(event, data, meta = {}) {\n return this.emit(event, data, meta);\n }\n\n /**\n * 异步触发事件(等待 handler 返回的 Promise)\n * @param {string} event\n * @param {*} [data]\n * @param {Object} [meta]\n * @returns {Promise<void>}\n */\n async emitAsync(event, data, meta = {}) {\n const timestamp = Date.now();\n const eventInfo = this.parseEventName(event);\n const fullMeta = { ...meta, timestamp, event, namespace: eventInfo.namespace };\n\n const runHandler = async (callback) => {\n try {\n const result = callback(data, fullMeta);\n if (result && typeof result.then === 'function') await result;\n } catch (e) {\n console.error(`[EventBus] async 事件 \"${event}\" 处理错误:`, e);\n }\n };\n\n const listeners = this.events.get(event);\n if (listeners) {\n for (const { callback } of listeners) await runHandler(callback);\n }\n for (const { regex, callback } of this.wildcardListeners) {\n if (regex.test(event)) await runHandler(callback);\n }\n if (eventInfo.namespace) {\n const nsListeners = this.events.get(`${eventInfo.namespace}:*`);\n if (nsListeners) {\n for (const { callback } of nsListeners) await runHandler(callback);\n }\n }\n }\n\n /**\n * 清除指定事件的所有订阅\n */\n clearEvent(event) {\n this.events.delete(event);\n return this;\n }\n\n /**\n * 清除指定命名空间的所有订阅\n */\n clearNamespace(namespace) {\n const events = this.namespaces.get(namespace);\n if (events) {\n events.forEach((event) => this.events.delete(event));\n this.namespaces.delete(namespace);\n }\n return this;\n }\n\n /**\n * 取消某命名空间下的所有订阅(clearNamespace 别名,向后兼容)\n */\n offNamespace(namespace) {\n return this.clearNamespace(namespace);\n }\n\n /**\n * 清空所有订阅\n */\n clear() {\n this.events.clear();\n this.namespaces.clear();\n this.wildcardListeners = [];\n return this;\n }\n\n /**\n * 获取事件的监听器数量\n */\n listenerCount(event) {\n const listeners = this.events.get(event);\n return listeners ? listeners.length : 0;\n }\n\n /**\n * 获取所有注册的事件名(eventNames 别名)\n */\n getEvents() {\n return Array.from(this.events.keys());\n }\n\n eventNames() {\n return this.getEvents();\n }\n\n /**\n * 获取所有命名空间\n */\n getNamespaces() {\n return Array.from(this.namespaces.keys());\n }\n\n /**\n * 等待某个事件触发(Promise 风格)\n * @param {string} event\n * @param {number} [timeout=5000] - 超时毫秒\n * @returns {Promise} 事件数据\n */\n waitFor(event, timeout = 5000) {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.off(event, handler);\n reject(new Error(`Timeout waiting for event: ${event}`));\n }, timeout);\n const handler = (data) => {\n clearTimeout(timer);\n this.off(event, handler);\n resolve(data);\n };\n this.on(event, handler);\n });\n }\n\n /**\n * 创建命名空间子总线\n * @param {string} namespace\n * @returns {{ on, once, emit, clear }}\n */\n createNamespace(namespace) {\n return {\n on: (event, callback, options = {}) =>\n this.on(event, callback, { ...options, namespace }),\n once: (event, callback, options = {}) =>\n this.once(event, callback, { ...options, namespace }),\n emit: (event, data, meta = {}) =>\n this.emit(`${namespace}:${event}`, data, meta),\n clear: () => this.clearNamespace(namespace),\n };\n }\n\n /**\n * 通配符匹配(内部使用,保留以兼容直接调用)\n */\n _matchPattern(pattern, event) {\n if (!pattern.includes('*')) return false;\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$');\n return regex.test(event);\n }\n}\n\n// 全局单例\nexport const eventBus = new EventBus();\nexport default eventBus;\n","/**\n * @nbreak/core - 扩展注册表\n *\n * 核心扩展注册表,按 type 分桶管理所有扩展物\n * 静态加载与动态加载的扩展最终都通过 register() 装载到此\n *\n * 对标:\n * - Superset: PluginContext.registerPlugin()\n * - DataV: 组件市场注册中心\n * - Tableau: Extensions Service\n */\n\nimport {\n EXTENSION_TYPES,\n ALL_EXTENSION_TYPES,\n EXTENSION_STATUS,\n validateManifest,\n deepClone,\n} from '@nbreak/shared';\nimport { pluginSystem } from './pluginSystem.js';\nimport { eventBus } from './eventBus.js';\n\nconst { HOOK_NAMES } = { HOOK_NAMES: {\n BEFORE_EXTENSION_REGISTER: 'beforeExtensionRegister',\n AFTER_EXTENSION_REGISTER: 'afterExtensionRegister',\n BEFORE_EXTENSION_UNREGISTER: 'beforeExtensionUnregister',\n} };\n\nclass ExtensionRegistry {\n constructor() {\n // type -> Map<name, Extension>\n this.buckets = new Map();\n for (const type of ALL_EXTENSION_TYPES) {\n this.buckets.set(type, new Map());\n }\n // name -> type 反向索引(便于按 name 跨类型查找)\n this.nameIndex = new Map();\n // 事件订阅 cleanup 函数集合\n this._disposers = [];\n }\n\n /**\n * 注册扩展\n * @param {Object} extension - 扩展定义对象\n * @returns {boolean} 是否注册成功\n */\n async register(extension) {\n if (!extension || !extension.type || !extension.name) {\n console.warn('[DataScreen Registry] 扩展注册失败:缺少 type 或 name', extension);\n return false;\n }\n\n if (!ALL_EXTENSION_TYPES.includes(extension.type)) {\n console.warn(`[DataScreen Registry] 无效的扩展类型: \"${extension.type}\"`);\n return false;\n }\n\n // 已存在同名扩展\n if (this.nameIndex.has(extension.name)) {\n console.warn(`[DataScreen Registry] 扩展 \"${extension.name}\" 已注册,跳过`);\n return false;\n }\n\n // manifest 校验(如果附带)\n if (extension.manifest) {\n const { valid, errors } = validateManifest(extension.manifest);\n if (!valid) {\n console.warn(`[DataScreen Registry] 扩展 \"${extension.name}\" manifest 校验失败:`, errors);\n return false;\n }\n }\n\n // 前置钩子\n try {\n await pluginSystem.callHook(HOOK_NAMES.BEFORE_EXTENSION_REGISTER, { extension });\n } catch (e) {\n console.error(`[DataScreen Registry] 扩展 \"${extension.name}\" 前置钩子异常:`, e);\n }\n\n // 装入分桶\n const bucket = this.buckets.get(extension.type);\n const ext = {\n ...extension,\n status: EXTENSION_STATUS.REGISTERED,\n registeredAt: Date.now(),\n };\n bucket.set(extension.name, ext);\n this.nameIndex.set(extension.name, extension.type);\n\n // 触发事件总线\n eventBus.emit('extension:registered', {\n type: extension.type,\n name: extension.name,\n extension: ext,\n });\n\n // 后置钩子\n try {\n await pluginSystem.callHook(HOOK_NAMES.AFTER_EXTENSION_REGISTER, { extension: ext });\n } catch (e) {\n console.error(`[DataScreen Registry] 扩展 \"${extension.name}\" 后置钩子异常:`, e);\n }\n\n return true;\n }\n\n /**\n * 批量注册扩展\n */\n async registerAll(extensions) {\n if (!Array.isArray(extensions)) return [];\n const results = [];\n for (const ext of extensions) {\n results.push(await this.register(ext));\n }\n return results;\n }\n\n /**\n * 注销扩展\n */\n async unregister(name) {\n const type = this.nameIndex.get(name);\n if (!type) return false;\n\n try {\n await pluginSystem.callHook(HOOK_NAMES.BEFORE_EXTENSION_UNREGISTER, { name, type });\n } catch (e) {\n console.error(`[DataScreen Registry] 扩展 \"${name}\" 注销前置钩子异常:`, e);\n }\n\n const bucket = this.buckets.get(type);\n const ext = bucket.get(name);\n bucket.delete(name);\n this.nameIndex.delete(name);\n\n eventBus.emit('extension:unregistered', { name, type, extension: ext });\n return true;\n }\n\n /**\n * 获取扩展(按 type + name)\n */\n get(type, name) {\n const bucket = this.buckets.get(type);\n if (!bucket) return null;\n return bucket.get(name) || null;\n }\n\n /**\n * 按 name 跨类型查找\n */\n getByName(name) {\n const type = this.nameIndex.get(name);\n if (!type) return null;\n return this.get(type, name);\n }\n\n /**\n * 获取某类型的所有扩展\n */\n getByType(type) {\n const bucket = this.buckets.get(type);\n if (!bucket) return [];\n return Array.from(bucket.values());\n }\n\n /**\n * 获取所有扩展\n */\n getAll() {\n const all = [];\n for (const bucket of this.buckets.values()) {\n for (const ext of bucket.values()) {\n all.push(ext);\n }\n }\n return all;\n }\n\n /**\n * 检查扩展是否存在\n */\n has(name) {\n return this.nameIndex.has(name);\n }\n\n /**\n * 按类型检查扩展是否存在\n */\n hasOfType(type, name) {\n const bucket = this.buckets.get(type);\n return bucket ? bucket.has(name) : false;\n }\n\n /**\n * 获取扩展数量\n */\n size(type) {\n if (type) {\n const bucket = this.buckets.get(type);\n return bucket ? bucket.size : 0;\n }\n return this.nameIndex.size;\n }\n\n /**\n * 启用扩展\n */\n enable(name) {\n const ext = this.getByName(name);\n if (ext) {\n ext.status = EXTENSION_STATUS.ENABLED;\n eventBus.emit('extension:enabled', { name, type: ext.type });\n }\n return this;\n }\n\n /**\n * 禁用扩展\n */\n disable(name) {\n const ext = this.getByName(name);\n if (ext) {\n ext.status = EXTENSION_STATUS.DISABLED;\n eventBus.emit('extension:disabled', { name, type: ext.type });\n }\n return this;\n }\n\n /**\n * 是否启用\n */\n isEnabled(name) {\n const ext = this.getByName(name);\n return ext ? ext.status === EXTENSION_STATUS.ENABLED : false;\n }\n\n /**\n * 按分类筛选组件扩展\n */\n getComponentsByCategory(category) {\n const components = this.getByType(EXTENSION_TYPES.COMPONENT);\n return components.filter(ext => ext.definition && ext.definition.category === category);\n }\n\n /**\n * 搜索组件扩展\n */\n searchComponents(keyword) {\n const components = this.getByType(EXTENSION_TYPES.COMPONENT);\n if (!keyword) return components;\n const lower = keyword.toLowerCase();\n return components.filter(ext => {\n const def = ext.definition || {};\n return (ext.name || '').toLowerCase().includes(lower) ||\n (def.name || '').toLowerCase().includes(lower) ||\n (ext.displayName || '').toLowerCase().includes(lower) ||\n (def.description || '').toLowerCase().includes(lower) ||\n (def.tags || []).some(t => t.toLowerCase().includes(lower));\n });\n }\n\n /**\n * 清空所有扩展\n */\n clear() {\n for (const bucket of this.buckets.values()) {\n bucket.clear();\n }\n this.nameIndex.clear();\n return this;\n }\n\n /**\n * 获取注册表快照(用于调试/序列化)\n */\n snapshot() {\n const snap = {};\n for (const [type, bucket] of this.buckets) {\n snap[type] = Array.from(bucket.keys());\n }\n return snap;\n }\n}\n\n// 全局单例\nexport const extensionRegistry = new ExtensionRegistry();\nexport { ExtensionRegistry };\nexport default ExtensionRegistry;\n","/**\n * @nbreak/core - 入口\n *\n * 提供插件系统、扩展注册表、事件总线\n * 无 Vue 依赖,可被任何 JS 环境引用\n */\n\n// 插件系统\nexport {\n PluginSystem,\n pluginSystem,\n HOOK_AGGREGATE_STRATEGIES,\n} from './pluginSystem.js';\n\n// 事件总线\nexport { EventBus, eventBus } from './eventBus.js';\n\n// 扩展注册表\nexport { ExtensionRegistry, extensionRegistry } from './extensionRegistry.js';\n\n// 共享常量(re-export 便于使用)\nexport {\n EXTENSION_TYPES,\n ALL_EXTENSION_TYPES,\n PROPERTY_FIELD_TYPES,\n COMPONENT_CATEGORIES,\n EXTENSION_STATUS,\n HOOK_NAMES,\n} from '@nbreak/shared';\n\n// 版本信息\nexport const VERSION = '0.1.0';\nexport const PACKAGE_NAME = '@nbreak/core';\n"],"mappings":"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"}
|