{"version":3,"file":"renderer-loader.cjs","sources":["../../../../src/elements/oscilloscope/renderer-loader.js"],"sourcesContent":["import fs from 'fs-extra';\r\nimport path from 'path';\r\nimport { fileURLToPath, pathToFileURL } from 'url';\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = path.dirname(__filename);\r\n\r\n/**\r\n * 渲染器注册表\r\n */\r\nconst renderers = new Map();\r\n\r\nfunction isCommonJS() {\r\n  return typeof require !== 'undefined' && \r\n         typeof module !== 'undefined' && \r\n         module.exports;\r\n}\r\n/**\r\n * 自动加载所有渲染器\r\n */\r\nexport async function loadRenderers() {\r\n  const renderersDir = path.join(__dirname, 'renderers');\r\n  \r\n  if (!await fs.pathExists(renderersDir)) {\r\n    console.warn(`[OscilloscopeRenderer] 渲染器目录不存在: ${renderersDir}`);\r\n    return;\r\n  }\r\n\r\n  const files = await fs.readdir(renderersDir);\r\n  // 支持 .js 和 .cjs 文件（构建后可能是 .cjs）\r\n  const jsFiles = files.filter(f => f.endsWith('.js') || f.endsWith('.cjs'));\r\n\r\n  // 检测是否是ESM环境（有import.meta.url）\r\n  const isESM = !isCommonJS()\r\n  for (const file of jsFiles) {\r\n    try {\r\n      const fileBaseName = path.basename(file, path.extname(file));\r\n      let renderer = null;\r\n      \r\n      if (isESM) {\r\n        // ESM 环境：使用动态 import\r\n        // 使用相对于当前文件的路径\r\n        const rendererPath = `./renderers/${fileBaseName}.js`;\r\n        try {\r\n          const rendererModule = await import(rendererPath);\r\n          renderer = rendererModule.default;\r\n        } catch (importError) {\r\n          // 如果相对路径失败，尝试使用绝对路径（file:// URL）\r\n          try {\r\n            const absolutePath = path.join(renderersDir, fileBaseName + '.js');\r\n            // 转换为 file:// URL\r\n            const fileUrl = pathToFileURL(absolutePath).href;\r\n            const rendererModule = await import(fileUrl);\r\n            renderer = rendererModule.default;\r\n          } catch (absoluteError) {\r\n            // 如果还是失败，记录错误但继续\r\n            console.warn(`[OscilloscopeRenderer] 无法加载渲染器 ${fileBaseName}:`, importError.message);\r\n          }\r\n        }\r\n      } else {\r\n        // CommonJS 环境：使用 require\r\n        try {\r\n          const rendererPath = path.join(renderersDir, file);\r\n          const rendererModule = require(rendererPath);\r\n          // CommonJS 模块可能使用 exports.default 或直接导出\r\n          renderer = rendererModule.default || rendererModule;\r\n          \r\n        } catch (requireError) {\r\n          console.warn(`[OscilloscopeRenderer] 无法加载渲染器 ${fileBaseName}:`, requireError.message);\r\n        }\r\n      }\r\n      \r\n      if (renderer && typeof renderer === 'function') {\r\n        const styleName = renderer.style || fileBaseName;\r\n        renderers.set(styleName, renderer);\r\n        // 如果文件名是 particles，也注册为 dots\r\n        if (styleName === 'particles') {\r\n          renderers.set('dots', renderer);\r\n        }\r\n      } else {\r\n        console.warn(`[OscilloscopeRenderer] 渲染器 ${fileBaseName} 不是有效的函数`);\r\n      }\r\n    } catch (error) {\r\n      console.warn(`[OscilloscopeRenderer] 加载渲染器 ${file} 时出错:`, error.message);\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * 获取渲染器\r\n * @param {string} style - 样式名称\r\n * @returns {Function|null} 渲染器函数\r\n */\r\nexport function getRenderer(style) {\r\n  return renderers.get(style) || null;\r\n}\r\n\r\n/**\r\n * 注册渲染器\r\n * @param {string} style - 样式名称\r\n * @param {Function} renderer - 渲染器函数\r\n */\r\nexport function registerRenderer(style, renderer) {\r\n  renderers.set(style, renderer);\r\n}\r\n\r\n/**\r\n * 获取所有已注册的渲染器名称\r\n * @returns {string[]} 渲染器名称数组\r\n */\r\nexport function getRegisteredStyles() {\r\n  return Array.from(renderers.keys());\r\n}\r\n\r\n// 自动加载渲染器（延迟加载，避免循环依赖）\r\nlet loadPromise = null;\r\nlet renderersLoaded = false;\r\n\r\nexport function ensureRenderersLoaded() {\r\n  if (renderersLoaded) {\r\n    return Promise.resolve();\r\n  }\r\n  if (!loadPromise) {\r\n    loadPromise = loadRenderers().then(() => {\r\n      renderersLoaded = true;\r\n    });\r\n  }\r\n  return loadPromise;\r\n}\r\n\r\n// 在模块加载时预加载渲染器（非阻塞）\r\nif (typeof window === 'undefined') {\r\n  // Node.js 环境：立即开始加载\r\n  ensureRenderersLoaded().catch(err => {\r\n    console.warn('[OscilloscopeRenderer] 预加载渲染器失败:', err.message);\r\n  });\r\n}\r\n\r\n"],"names":["__filename","fileURLToPath","__dirname","pathToFileURL"],"mappings":"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"}