@nbreak/datasources 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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["fetchData","fetchData","fetchData","fetchData","fetchData","fetchData","staticAdapter","apiAdapter","websocketAdapter","excelAdapter","csvAdapter","mockAdapter","databaseAdapter"],"sources":["../../src/adapters/staticAdapter.js","../../src/adapters/apiAdapter.js","../../src/adapters/websocketAdapter.js","../../src/adapters/excelAdapter.js","../../src/adapters/csvAdapter.js","../../src/adapters/mockAdapter.js","../../src/adapters/databaseAdapter.js","../../src/index.js"],"sourcesContent":["/**\n * @nbreak/datasources - 静态数据源适配器\n */\nimport { defineDataSourceExtension } from '@nbreak/sdk';\n\n/**\n * 裸取数函数:返回传入的静态数据,返回 { data, meta }\n * @param {Object} config\n * @returns {Promise<{data: any, meta: Object}>}\n */\nexport async function fetchData(config) {\n const { data = [], transform } = config;\n let result = data;\n if (typeof transform === 'function') {\n result = transform(data);\n }\n return { data: result, meta: { total: Array.isArray(result) ? result.length : 1 } };\n}\n\nclass StaticAdapter {\n async fetchData(config) {\n return fetchData(config);\n }\n\n async subscribe(_config, callback) {\n return () => {};\n }\n\n async test() {\n return { success: true, message: '静态数据源总是可用' };\n }\n}\n\nexport default defineDataSourceExtension({\n type: 'static',\n name: '静态数据',\n adapter: new StaticAdapter(),\n configSchema: [\n {\n key: 'data',\n label: '数据内容',\n type: 'json',\n group: '基础',\n default: [],\n description: 'JSON 格式的静态数据',\n },\n ],\n defaults: { data: [] },\n description: 'JSON 静态数据源,适用于测试与简单场景',\n});\n","/**\n * @nbreak/datasources - REST API 数据源适配器\n */\nimport { defineDataSourceExtension } from '@nbreak/sdk';\n\n/**\n * 裸取数函数:执行 REST API 请求并返回 { data, meta }\n * 支持 optional signal(外部取消)/ responseType(显式覆盖)/ credentials\n * @param {Object} config\n * @returns {Promise<{data: any, meta: Object}>}\n */\nexport async function fetchData(config) {\n const {\n url,\n method = 'GET',\n headers = {},\n body,\n params = {},\n timeout = 10000,\n transform,\n signal,\n responseType,\n credentials,\n } = config;\n\n if (!url) {\n throw new Error('API 数据源需要配置 url');\n }\n\n // 拼接 query params\n const urlObj = new URL(url, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');\n Object.entries(params).forEach(([k, v]) => {\n if (v !== undefined && v !== null) urlObj.searchParams.append(k, v);\n });\n\n // 外部传入 signal 时直接复用,但仍创建内部定时器用于超时控制;\n // 这样调用方既能通过 abort(signal) 主动取消,也能享受 A 层的超时保护\n const controller = signal ? null : new AbortController();\n const fetchSignal = signal || controller.signal;\n const abortFn = signal ? () => signal.abort() : () => controller.abort();\n const timer = setTimeout(abortFn, timeout);\n\n try {\n const fetchOptions = {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n body: method !== 'GET' && body ? JSON.stringify(body) : undefined,\n signal: fetchSignal,\n };\n if (credentials) {\n fetchOptions.credentials = credentials;\n }\n\n const response = await fetch(urlObj.toString(), fetchOptions);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n let data;\n if (responseType) {\n switch (responseType) {\n case 'json':\n data = await response.json();\n break;\n case 'text':\n data = await response.text();\n break;\n case 'blob':\n data = await response.blob();\n break;\n case 'arrayBuffer':\n data = await response.arrayBuffer();\n break;\n case 'formData':\n data = await response.formData();\n break;\n default:\n data = await response.json();\n }\n } else {\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n }\n\n if (typeof transform === 'function') {\n data = transform(data);\n }\n\n return { data, meta: { status: response.status } };\n } finally {\n clearTimeout(timer);\n }\n}\n\nclass ApiAdapter {\n async fetchData(config) {\n return fetchData(config);\n }\n\n async subscribe(config, callback) {\n if (!config.pollInterval || config.pollInterval < 1000) return () => {};\n let active = true;\n const poll = async () => {\n if (!active) return;\n try {\n const { data } = await this.fetchData(config);\n callback(data);\n } catch (e) {\n // 静默忽略\n }\n if (active) {\n setTimeout(poll, config.pollInterval);\n }\n };\n poll();\n return () => { active = false; };\n }\n\n async test(config) {\n try {\n await this.fetchData({ ...config, timeout: 5000 });\n return { success: true, message: '连接成功' };\n } catch (e) {\n return { success: false, message: e.message };\n }\n }\n}\n\nexport default defineDataSourceExtension({\n type: 'api',\n name: 'REST API',\n adapter: new ApiAdapter(),\n configSchema: [\n {\n key: 'url',\n label: '接口地址',\n type: 'text',\n group: '基础',\n default: '',\n required: true,\n },\n {\n key: 'method',\n label: '请求方法',\n type: 'select',\n group: '基础',\n default: 'GET',\n options: ['GET', 'POST', 'PUT', 'DELETE'].map(m => ({ label: m, value: m })),\n },\n {\n key: 'headers',\n label: '请求头',\n type: 'json',\n group: '高级',\n default: {},\n },\n {\n key: 'body',\n label: '请求体',\n type: 'json',\n group: '高级',\n default: null,\n visible: (props) => props.method !== 'GET',\n },\n {\n key: 'params',\n label: '查询参数',\n type: 'json',\n group: '高级',\n default: {},\n },\n {\n key: 'pollInterval',\n label: '轮询间隔(ms)',\n type: 'number',\n group: '实时',\n default: 0,\n min: 0,\n description: '大于 1000 时启用轮询',\n },\n {\n key: 'timeout',\n label: '超时(ms)',\n type: 'number',\n group: '高级',\n default: 10000,\n min: 1000,\n max: 60000,\n },\n ],\n defaults: {\n url: '',\n method: 'GET',\n headers: {},\n params: {},\n pollInterval: 0,\n timeout: 10000,\n },\n description: 'REST API 数据源,支持 GET/POST/PUT/DELETE 与轮询',\n});\n","/**\n * @nbreak/datasources - WebSocket 实时数据源适配器\n */\nimport { defineDataSourceExtension } from '@nbreak/sdk';\n\n/**\n * 裸取数函数:WebSocket 不支持单次拉取,返回 null 标记实时模式\n * @param {Object} _config\n * @returns {Promise<{data: null, meta: Object}>}\n */\nexport async function fetchData(_config) {\n // WebSocket 不支持单次拉取,返回 null\n return { data: null, meta: { realtime: true } };\n}\n\nclass WebSocketAdapter {\n async fetchData(config) {\n return fetchData(config);\n }\n\n async subscribe(config, callback) {\n const { url, protocols, reconnect = true, maxRetries = 5 } = config;\n if (!url) {\n throw new Error('WebSocket 数据源需要配置 url');\n }\n\n let ws = null;\n let retryCount = 0;\n let closed = false;\n\n const connect = () => {\n if (closed) return;\n try {\n ws = new WebSocket(url, protocols);\n\n ws.onopen = () => {\n retryCount = 0;\n };\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n callback(data);\n } catch (e) {\n callback(event.data);\n }\n };\n\n ws.onclose = () => {\n if (reconnect && !closed && retryCount < maxRetries) {\n retryCount++;\n const delay = Math.min(1000 * Math.pow(2, retryCount), 30000);\n setTimeout(connect, delay);\n }\n };\n\n ws.onerror = (e) => {\n console.error('[WebSocket Adapter] error:', e);\n };\n } catch (e) {\n console.error('[WebSocket Adapter] connect failed:', e);\n }\n };\n\n connect();\n\n return () => {\n closed = true;\n if (ws) {\n ws.close();\n }\n };\n }\n\n async test(config) {\n return new Promise((resolve) => {\n try {\n const ws = new WebSocket(config.url);\n const timer = setTimeout(() => {\n ws.close();\n resolve({ success: false, message: '连接超时' });\n }, 5000);\n\n ws.onopen = () => {\n clearTimeout(timer);\n ws.close();\n resolve({ success: true, message: 'WebSocket 连接成功' });\n };\n\n ws.onerror = () => {\n clearTimeout(timer);\n resolve({ success: false, message: 'WebSocket 连接失败' });\n };\n } catch (e) {\n resolve({ success: false, message: e.message });\n }\n });\n }\n}\n\nexport default defineDataSourceExtension({\n type: 'websocket',\n name: 'WebSocket 实时',\n adapter: new WebSocketAdapter(),\n configSchema: [\n {\n key: 'url',\n label: 'WebSocket 地址',\n type: 'text',\n group: '基础',\n default: '',\n required: true,\n placeholder: 'ws://localhost:8080/ws',\n },\n {\n key: 'protocols',\n label: '子协议',\n type: 'text',\n group: '高级',\n default: '',\n },\n {\n key: 'reconnect',\n label: '自动重连',\n type: 'switch',\n group: '高级',\n default: true,\n },\n {\n key: 'maxRetries',\n label: '最大重试次数',\n type: 'number',\n group: '高级',\n default: 5,\n min: 0,\n max: 100,\n },\n ],\n defaults: {\n url: '',\n protocols: '',\n reconnect: true,\n maxRetries: 5,\n },\n description: 'WebSocket 实时数据源,支持自动重连与指数退避',\n});\n","/**\n * @nbreak/datasources - Excel 文件数据源适配器\n *\n * 基于 xlsx 库解析 Excel 文件,支持 .xlsx/.xls 格式\n */\nimport { defineDataSourceExtension } from '@nbreak/sdk';\n\n/**\n * 读取文件内容为 ArrayBuffer\n * @param {string|Blob|ArrayBuffer|Uint8Array} file - 文件源\n * @returns {Promise<ArrayBuffer>}\n */\nasync function readFile(file) {\n if (typeof file === 'string') {\n // URL 形式\n const response = await fetch(file);\n return await response.arrayBuffer();\n }\n if (file instanceof ArrayBuffer || file instanceof Uint8Array) {\n return file;\n }\n if (file instanceof Blob) {\n return await file.arrayBuffer();\n }\n throw new Error('不支持的 file 类型');\n}\n\n/**\n * 裸取数函数:基于 xlsx 库解析 Excel 文件,返回 { data, meta }\n * @param {Object} config\n * @returns {Promise<{data: Array, meta: Object}>}\n */\nexport async function fetchData(config) {\n const { file, sheetName, range, transform } = config;\n\n if (!file && !config.fileContent) {\n throw new Error('Excel 数据源需要配置 file(File 对象)或 fileContent(ArrayBuffer/base64 字符串)');\n }\n\n // 动态导入 xlsx(避免未安装时崩溃)\n let XLSX;\n try {\n XLSX = (await import('xlsx')).default || await import('xlsx');\n } catch (e) {\n throw new Error('未安装 xlsx 库,请运行 pnpm add xlsx');\n }\n\n const data = config.fileContent || await readFile(file);\n // P2-13: fileContent 支持三种形态:\n // - ArrayBuffer / Uint8Array(内存中刚上传的文件)\n // - base64 字符串(持久化后恢复的配置,JSON 可序列化)\n // - 普通对象(旧版本 ArrayBuffer 被 JSON.stringify 序列化成的 {},内容已丢失)\n let workbook;\n if (typeof data === 'string') {\n workbook = XLSX.read(data, { type: 'base64' });\n } else if (data instanceof ArrayBuffer || data instanceof Uint8Array) {\n workbook = XLSX.read(data, { type: 'array' });\n } else {\n throw new Error('fileContent 无法解析(旧配置中的文件内容已丢失,请重新上传 Excel 文件)');\n }\n\n // 选择工作表\n const sheet = sheetName\n ? workbook.Sheets[sheetName]\n : workbook.Sheets[workbook.SheetNames[0]];\n\n if (!sheet) {\n throw new Error(`工作表 \"${sheetName || '[默认]'}\" 不存在`);\n }\n\n // 解析为 JSON\n const options = {};\n if (range) options.range = range;\n let result = XLSX.utils.sheet_to_json(sheet, options);\n\n if (typeof transform === 'function') {\n result = transform(result);\n }\n\n return {\n data: result,\n meta: {\n total: result.length,\n sheetName: sheetName || workbook.SheetNames[0],\n sheets: workbook.SheetNames,\n },\n };\n}\n\nclass ExcelAdapter {\n async fetchData(config) {\n return fetchData(config);\n }\n\n async _readFile(file) {\n return readFile(file);\n }\n\n async subscribe(_config, _callback) {\n return () => {};\n }\n\n async test(config) {\n try {\n if (!config.file && !config.fileContent) {\n return { success: false, message: '需要配置 file' };\n }\n return { success: true, message: 'Excel 数据源配置有效' };\n } catch (e) {\n return { success: false, message: e.message };\n }\n }\n}\n\nexport default defineDataSourceExtension({\n type: 'excel',\n name: 'Excel 文件',\n adapter: new ExcelAdapter(),\n configSchema: [\n {\n key: 'file',\n label: 'Excel 文件',\n type: 'text',\n group: '基础',\n default: '',\n description: '文件 URL 或 File 对象',\n },\n {\n key: 'sheetName',\n label: '工作表名',\n type: 'text',\n group: '基础',\n default: '',\n placeholder: '留空使用第一个工作表',\n },\n {\n key: 'range',\n label: '数据范围',\n type: 'text',\n group: '高级',\n default: '',\n placeholder: 'A1:D100',\n },\n ],\n defaults: {\n file: '',\n sheetName: '',\n range: '',\n },\n description: 'Excel 文件数据源,支持 .xlsx/.xls 格式解析',\n});\n","/**\n * @nbreak/datasources - CSV 文本数据源适配器\n *\n * 解析 CSV 文本为对象数组,支持自定义分隔符与表头\n */\nimport { defineDataSourceExtension } from '@nbreak/sdk';\n\n/**\n * 解析 CSV 文本为二维数组\n * @param {string} text - CSV 文本\n * @param {string} delimiter - 分隔符\n * @param {string} quote - 引号字符\n * @returns {Array<Array<string>>}\n */\nfunction parseCsv(text, delimiter, quote) {\n const rows = [];\n let currentRow = [];\n let currentField = '';\n let inQuotes = false;\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const nextChar = text[i + 1];\n\n if (inQuotes) {\n if (char === quote) {\n if (nextChar === quote) {\n currentField += quote;\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n currentField += char;\n }\n } else {\n if (char === quote) {\n inQuotes = true;\n } else if (char === delimiter) {\n currentRow.push(currentField);\n currentField = '';\n } else if (char === '\\n' || char === '\\r') {\n if (char === '\\r' && nextChar === '\\n') i++;\n currentRow.push(currentField);\n currentField = '';\n if (currentRow.length > 1 || currentRow[0] !== '') {\n rows.push(currentRow);\n }\n currentRow = [];\n } else {\n currentField += char;\n }\n }\n }\n if (currentField !== '' || currentRow.length > 0) {\n currentRow.push(currentField);\n rows.push(currentRow);\n }\n return rows;\n}\n\n/**\n * 裸取数函数:解析 CSV 文本为对象数组,返回 { data, meta }\n * @param {Object} config\n * @returns {Promise<{data: Array, meta: Object}>}\n */\nexport async function fetchData(config) {\n const {\n content = '',\n url = '',\n delimiter = ',',\n hasHeader = true,\n quote = '\"',\n transform,\n } = config;\n\n let csvText = content;\n if (!csvText && url) {\n const response = await fetch(url);\n csvText = await response.text();\n }\n\n if (!csvText) {\n return { data: [], meta: { total: 0 } };\n }\n\n const rows = parseCsv(csvText, delimiter, quote);\n if (rows.length === 0) {\n return { data: [], meta: { total: 0 } };\n }\n\n let result;\n if (hasHeader) {\n const headers = rows[0];\n result = rows.slice(1).map(row => {\n const obj = {};\n headers.forEach((h, i) => {\n obj[h] = row[i] !== undefined ? row[i] : '';\n });\n return obj;\n });\n } else {\n result = rows.map(row => ({\n values: row,\n }));\n }\n\n if (typeof transform === 'function') {\n result = transform(result);\n }\n\n return { data: result, meta: { total: result.length } };\n}\n\nclass CsvAdapter {\n async fetchData(config) {\n return fetchData(config);\n }\n\n _parse(text, delimiter, quote) {\n return parseCsv(text, delimiter, quote);\n }\n\n async subscribe(_config, _callback) {\n return () => {};\n }\n\n async test(config) {\n if (!config.content && !config.url) {\n return { success: false, message: '需要配置 content 或 url' };\n }\n return { success: true, message: 'CSV 数据源配置有效' };\n }\n}\n\nexport default defineDataSourceExtension({\n type: 'csv',\n name: 'CSV 文本',\n adapter: new CsvAdapter(),\n configSchema: [\n {\n key: 'content',\n label: 'CSV 内容',\n type: 'textarea',\n group: '基础',\n default: '',\n description: '直接粘贴 CSV 文本',\n },\n {\n key: 'url',\n label: '文件 URL',\n type: 'text',\n group: '基础',\n default: '',\n description: '远程 CSV 文件地址(content 为空时使用)',\n },\n {\n key: 'delimiter',\n label: '分隔符',\n type: 'select',\n group: '解析',\n default: ',',\n options: [\n { label: '逗号 (,)', value: ',' },\n { label: '分号 (;)', value: ';' },\n { label: '制表符 (\\\\t)', value: '\\t' },\n { label: '竖线 (|)', value: '|' },\n ],\n },\n {\n key: 'hasHeader',\n label: '首行表头',\n type: 'switch',\n group: '解析',\n default: true,\n },\n {\n key: 'quote',\n label: '引号字符',\n type: 'text',\n group: '高级',\n default: '\"',\n },\n ],\n defaults: {\n content: '',\n url: '',\n delimiter: ',',\n hasHeader: true,\n quote: '\"',\n },\n description: 'CSV 文本数据源,支持自定义分隔符与表头解析',\n});\n","/**\n * @nbreak/datasources - Mock 模拟数据源适配器\n *\n * 用于开发测试,支持生成随机数据与定时刷新\n */\nimport { defineDataSourceExtension } from '@nbreak/sdk';\n\n/**\n * 生成单个对象\n * @param {Array} schema - 数据结构\n * @param {Function} random - 随机数生成函数\n * @param {number} index - 索引\n * @returns {Object}\n */\nfunction generateObject(schema, random, index = 0) {\n if (!schema || schema.length === 0) {\n return {\n id: index,\n label: `项目 ${index + 1}`,\n value: Math.floor(random() * 1000),\n };\n }\n const obj = {};\n for (const field of schema) {\n const { key, type = 'number' } = field;\n switch (type) {\n case 'number':\n obj[key] = Math.floor(random() * (field.max || 1000));\n break;\n case 'string':\n obj[key] = `${field.prefix || 'item'}_${index}`;\n break;\n case 'boolean':\n obj[key] = random() > 0.5;\n break;\n case 'date':\n obj[key] = new Date(Date.now() - random() * 30 * 24 * 60 * 60 * 1000).toISOString();\n break;\n case 'category':\n obj[key] = field.options\n ? field.options[Math.floor(random() * field.options.length)]\n : `类别${Math.floor(random() * 5)}`;\n break;\n default:\n obj[key] = random();\n }\n }\n return obj;\n}\n\n/**\n * 生成 Mock 数据\n * @param {string} dataType - 数据类型 (array/object)\n * @param {number} count - 数据条数\n * @param {Array} schema - 数据结构\n * @param {number} seed - 随机种子\n * @returns {any}\n */\nfunction generate(dataType, count, schema, seed) {\n // 简单的伪随机数生成器(基于 seed)\n let s = seed;\n const random = () => {\n s = (s * 9301 + 49297) % 233280;\n return s / 233280;\n };\n\n if (dataType === 'object') {\n return generateObject(schema, random);\n }\n\n const arr = [];\n for (let i = 0; i < count; i++) {\n arr.push(generateObject(schema, random, i));\n }\n return arr;\n}\n\n/**\n * 裸取数函数:生成 Mock 数据,返回 { data, meta }\n * @param {Object} config\n * @returns {Promise<{data: any, meta: Object}>}\n */\nexport async function fetchData(config) {\n const {\n type: dataType = 'array',\n count = 10,\n interval = 0,\n schema = [],\n seed = 42,\n } = config;\n\n const data = generate(dataType, count, schema, seed);\n\n return {\n data,\n meta: {\n total: Array.isArray(data) ? data.length : 1,\n generatedAt: Date.now(),\n },\n };\n}\n\nclass MockAdapter {\n async fetchData(config) {\n return fetchData(config);\n }\n\n _generate(dataType, count, schema, seed) {\n return generate(dataType, count, schema, seed);\n }\n\n _generateObject(schema, random, index = 0) {\n return generateObject(schema, random, index);\n }\n\n async subscribe(config, callback) {\n if (!config.interval || config.interval < 500) return () => {};\n let active = true;\n const poll = async () => {\n if (!active) return;\n try {\n const { data } = await this.fetchData(config);\n callback(data);\n } catch (e) {\n // 静默\n }\n if (active) {\n setTimeout(poll, config.interval);\n }\n };\n poll();\n return () => { active = false; };\n }\n\n async test() {\n return { success: true, message: 'Mock 数据源总是可用' };\n }\n}\n\nexport default defineDataSourceExtension({\n type: 'mock',\n name: 'Mock 模拟数据',\n adapter: new MockAdapter(),\n configSchema: [\n {\n key: 'type',\n label: '数据类型',\n type: 'select',\n group: '基础',\n default: 'array',\n options: [\n { label: '数组', value: 'array' },\n { label: '对象', value: 'object' },\n ],\n },\n {\n key: 'count',\n label: '数据条数',\n type: 'slider',\n group: '基础',\n default: 10,\n min: 1,\n max: 100,\n },\n {\n key: 'seed',\n label: '随机种子',\n type: 'number',\n group: '基础',\n default: 42,\n description: '相同种子生成相同数据',\n },\n {\n key: 'interval',\n label: '刷新间隔(ms)',\n type: 'number',\n group: '实时',\n default: 0,\n min: 0,\n description: '大于 500 时启用定时刷新',\n },\n {\n key: 'schema',\n label: '数据结构',\n type: 'json',\n group: '高级',\n default: [],\n description: '定义每条数据的字段结构',\n },\n ],\n defaults: {\n type: 'array',\n count: 10,\n seed: 42,\n interval: 0,\n schema: [],\n },\n description: 'Mock 模拟数据源,支持随机数据生成与定时刷新,适用于开发测试',\n});\n","/**\n * @nbreak/datasources - 数据库直连数据源适配器\n *\n * 浏览器无法直连 MySQL/PostgreSQL,本适配器通过 HTTP 调用后端代理\n * (默认 /api/db/query)完成取数。后端持有真实驱动与连接池。\n */\nimport { defineDataSourceExtension } from '@nbreak/sdk';\n\n// 默认后端代理地址(相对路径,由 Vite proxy / 部署层反代转发到后端服务)\nconst DEFAULT_PROXY_URL = '/api/db/query';\nconst DEFAULT_TEST_URL = '/api/db/test';\n\n/**\n * 裸取数函数:调用后端代理执行 SQL 查询,返回 { data, meta }\n * @param {Object} config\n * @param {string} config.dbType - 数据库类型:mysql | postgresql\n * @param {string} config.host - 主机地址\n * @param {number} config.port - 端口\n * @param {string} config.database - 数据库名\n * @param {string} config.username - 用户名\n * @param {string} config.password - 密码\n * @param {string} config.query - SQL 查询语句(仅允许 SELECT)\n * @param {Array} config.params - 参数化查询占位符\n * @param {string} [config.proxyUrl] - 自定义代理地址\n * @param {number} [config.timeout] - 超时(ms)\n * @param {AbortSignal} [config.signal] - 外部取消信号\n * @returns {Promise<{data: any, meta: Object}>}\n */\nexport async function fetchData(config) {\n const {\n dbType,\n host,\n port,\n database,\n username,\n password,\n query,\n params = [],\n proxyUrl = DEFAULT_PROXY_URL,\n timeout = 30000,\n connectionOptions = {},\n signal,\n } = config;\n\n if (!dbType) {\n throw new Error('数据库数据源需要配置 dbType');\n }\n if (!query) {\n throw new Error('数据库数据源需要配置 query (SQL 语句)');\n }\n\n const controller = signal ? null : new AbortController();\n const fetchSignal = signal || controller.signal;\n const abortFn = signal ? () => signal.abort() : () => controller.abort();\n const timer = setTimeout(abortFn, timeout);\n\n try {\n const response = await fetch(proxyUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n dbType,\n host,\n port,\n database,\n username,\n password,\n query,\n params,\n connectionOptions,\n }),\n signal: fetchSignal,\n });\n\n if (!response.ok) {\n let errMsg = `HTTP ${response.status}: ${response.statusText}`;\n try {\n const errBody = await response.json();\n if (errBody.error) errMsg = errBody.error;\n } catch (_) {\n // 忽略 JSON 解析失败\n }\n throw new Error(errMsg);\n }\n\n const result = await response.json();\n // 后端返回 { success, data, meta }\n return {\n data: result.data,\n meta: result.meta || { rowCount: Array.isArray(result.data) ? result.data.length : 0 },\n };\n } finally {\n clearTimeout(timer);\n }\n}\n\nclass DatabaseAdapter {\n async fetchData(config) {\n return fetchData(config);\n }\n\n async test(config) {\n try {\n const testUrl = config.testUrl || DEFAULT_TEST_URL;\n const response = await fetch(testUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n dbType: config.dbType,\n host: config.host,\n port: config.port,\n database: config.database,\n username: config.username,\n password: config.password,\n connectionOptions: config.connectionOptions,\n }),\n });\n if (!response.ok) {\n const err = await response.json().catch(() => ({}));\n return { success: false, message: err.error || `HTTP ${response.status}` };\n }\n const result = await response.json();\n return { success: result.success !== false, message: result.message || '连接成功' };\n } catch (e) {\n return { success: false, message: e.message };\n }\n }\n}\n\nexport default defineDataSourceExtension({\n type: 'database',\n name: '数据库',\n adapter: new DatabaseAdapter(),\n configSchema: [\n {\n key: 'dbType',\n label: '数据库类型',\n type: 'select',\n group: '连接',\n default: 'mysql',\n required: true,\n options: [\n { label: 'MySQL', value: 'mysql' },\n { label: 'PostgreSQL', value: 'postgresql' },\n ],\n },\n {\n key: 'host',\n label: '主机地址',\n type: 'text',\n group: '连接',\n default: 'localhost',\n required: true,\n },\n {\n key: 'port',\n label: '端口',\n type: 'number',\n group: '连接',\n default: 3306,\n },\n {\n key: 'database',\n label: '数据库名',\n type: 'text',\n group: '连接',\n default: '',\n required: true,\n },\n {\n key: 'username',\n label: '用户名',\n type: 'text',\n group: '连接',\n default: 'root',\n required: true,\n },\n {\n key: 'password',\n label: '密码',\n type: 'password',\n group: '连接',\n default: '',\n },\n {\n key: 'query',\n label: 'SQL 查询',\n type: 'textarea',\n group: '查询',\n default: 'SELECT 1',\n required: true,\n description: '仅允许 SELECT / WITH / SHOW / DESCRIBE / EXPLAIN',\n },\n {\n key: 'params',\n label: '参数化查询',\n type: 'json',\n group: '查询',\n default: [],\n },\n {\n key: 'timeout',\n label: '超时(ms)',\n type: 'number',\n group: '高级',\n default: 30000,\n min: 1000,\n max: 120000,\n },\n ],\n defaults: {\n dbType: 'mysql',\n host: 'localhost',\n port: 3306,\n database: '',\n username: 'root',\n password: '',\n query: 'SELECT 1',\n params: [],\n timeout: 30000,\n },\n description: '数据库直连数据源,支持 MySQL / PostgreSQL,通过后端代理执行查询',\n});\n","/**\n * @nbreak/datasources - 入口\n *\n * 导出 7 个内置数据源扩展:\n * - Static 静态 JSON\n * - API RESTful\n * - WebSocket 实时推送\n * - Excel 文件解析\n * - CSV 文本解析\n * - Mock 模拟数据\n * - Database 数据库查询\n *\n * 应用方使用方式:\n * import datasources from '@nbreak/datasources'\n * app.use(DataScreenVue, { extensions: datasources.extensions })\n *\n * B 层运行态适配器(src/datasources/adapters)可通过命名导出复用 A 层裸取数函数:\n * import { fetchApiData, fetchCsvData } from '@nbreak/datasources'\n */\nimport staticAdapter from './adapters/staticAdapter.js';\nimport apiAdapter from './adapters/apiAdapter.js';\nimport websocketAdapter from './adapters/websocketAdapter.js';\nimport excelAdapter from './adapters/excelAdapter.js';\nimport csvAdapter from './adapters/csvAdapter.js';\nimport mockAdapter from './adapters/mockAdapter.js';\nimport databaseAdapter from './adapters/databaseAdapter.js';\n\nexport const extensions = [\n staticAdapter,\n apiAdapter,\n websocketAdapter,\n excelAdapter,\n csvAdapter,\n mockAdapter,\n databaseAdapter,\n];\n\nexport const adapters = {\n static: staticAdapter.definition.adapter,\n api: apiAdapter.definition.adapter,\n websocket: websocketAdapter.definition.adapter,\n excel: excelAdapter.definition.adapter,\n csv: csvAdapter.definition.adapter,\n mock: mockAdapter.definition.adapter,\n database: databaseAdapter.definition.adapter,\n};\n\nexport default { extensions };\n\nexport {\n staticAdapter,\n apiAdapter,\n websocketAdapter,\n excelAdapter,\n csvAdapter,\n mockAdapter,\n databaseAdapter,\n};\n\n// A 层裸取数函数命名导出,供 B 层运行态适配器委托复用\nexport { fetchData as fetchStaticData } from './adapters/staticAdapter.js';\nexport { fetchData as fetchApiData } from './adapters/apiAdapter.js';\nexport { fetchData as fetchWebSocketData } from './adapters/websocketAdapter.js';\nexport { fetchData as fetchExcelData } from './adapters/excelAdapter.js';\nexport { fetchData as fetchCsvData } from './adapters/csvAdapter.js';\nexport { fetchData as fetchMockData } from './adapters/mockAdapter.js';\nexport { fetchData as fetchDatabaseData } from './adapters/databaseAdapter.js';\n\nexport const VERSION = '0.1.0';\nexport const PACKAGE_NAME = '@nbreak/datasources';\n"],"mappings":"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"}