@nbreak/sdk 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/bin/datascreen.js +14 -0
- package/dist/cjs/cli/index.cjs +823 -0
- package/dist/cjs/cli/index.cjs.map +1 -0
- package/dist/cjs/index.cjs +345 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/esm/cli/index.js +821 -0
- package/dist/esm/cli/index.js.map +1 -0
- package/dist/esm/index.js +279 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["join","join"],"sources":["../../../__vite-browser-external","../../../src/templates/component.js","../../../src/templates/theme.js","../../../src/templates/datasource.js","../../../src/templates/template.js","../../../src/templates/action.js","../../../src/templates/propertyField.js","../../../src/templates/shared.js","../../../src/templates/index.js","../../../src/cli/commands/init.js","../../../src/manifest-node.js","../../../src/cli/commands/build.js","../../../src/cli/commands/pack.js","../../../src/cli/commands/list.js","../../../src/cli/commands/validate.js","../../../src/cli/index.js"],"sourcesContent":["module.exports = {}","/**\n * 组件扩展模板\n */\nexport function componentTemplate(name) {\n const componentName = name.replace(/[^a-zA-Z0-9]/g, '');\n\n return {\n 'src/index.js': `import { defineComponentExtension } from '@nbreak/sdk';\nimport Component from './${componentName}.vue';\nimport schema from './schema.js';\nimport defaults from './defaults.js';\n\nexport default defineComponentExtension({\n type: '${name}',\n name: '${name}',\n category: 'charts',\n component: Component,\n schema,\n defaults,\n tags: ['自定义'],\n icon: 'AppstoreOutlined',\n description: '${name} 自定义组件',\n});\n`,\n [`src/${componentName}.vue`]: `<template>\n <div class=\"${name}-container\">\n <h3>{{ title }}</h3>\n <p>{{ content }}</p>\n </div>\n</template>\n\n<script setup>\ndefineProps({\n title: { type: String, default: '默认标题' },\n content: { type: String, default: '默认内容' },\n color: { type: String, default: '#1890ff' },\n});\n</script>\n\n<style scoped>\n.${name}-container {\n padding: 16px;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 8px;\n}\n</style>\n`,\n 'src/schema.js': `export default [\n {\n key: 'title',\n label: '标题',\n type: 'text',\n group: '基础',\n default: '默认标题',\n },\n {\n key: 'content',\n label: '内容',\n type: 'textarea',\n group: '基础',\n default: '默认内容',\n },\n {\n key: 'color',\n label: '主色',\n type: 'color',\n group: '样式',\n default: '#1890ff',\n },\n];\n`,\n 'src/defaults.js': `export default {\n title: '默认标题',\n content: '默认内容',\n color: '#1890ff',\n};\n`,\n };\n}\n","/**\n * 主题扩展模板\n */\nexport function themeTemplate(name) {\n return {\n 'src/index.js': `import { defineThemeExtension } from '@nbreak/sdk';\nimport tokens from './tokens.js';\n\nexport default defineThemeExtension({\n id: '${name}',\n name: '${name} 主题',\n tokens,\n isDark: true,\n description: '${name} 自定义主题',\n});\n`,\n 'src/tokens.js': `export default {\n '--ds-color-primary': '#1890ff',\n '--ds-color-success': '#52c41a',\n '--ds-color-warning': '#faad14',\n '--ds-color-error': '#f5222d',\n '--ds-color-text': 'rgba(255,255,255,0.85)',\n '--ds-color-text-secondary': 'rgba(255,255,255,0.65)',\n '--ds-color-bg': '#0a1628',\n '--ds-color-bg-secondary': '#0d1f3c',\n '--ds-color-border': 'rgba(255,255,255,0.1)',\n '--ds-font-size-base': '14px',\n '--ds-font-size-lg': '16px',\n '--ds-font-size-sm': '12px',\n '--ds-border-radius': '6px',\n '--ds-spacing-base': '8px',\n};\n`,\n };\n}\n","/**\n * 数据源扩展模板\n */\nexport function datasourceTemplate(name) {\n return {\n 'src/index.js': `import { defineDataSourceExtension } from '@nbreak/sdk';\nimport configSchema from './schema.js';\nimport defaults from './defaults.js';\n\nclass ${pascalCase(name)}Adapter {\n async fetchData(config) {\n // TODO: 实现 ${name} 数据获取逻辑\n // config 包含数据源配置项\n // 返回 { data: any, meta?: { total, page } }\n return {\n data: [\n { label: '示例 A', value: 100 },\n { label: '示例 B', value: 200 },\n ],\n };\n }\n\n async subscribe(config, callback) {\n // TODO: 实现实时数据订阅(如需要)\n // 调用 callback(data) 推送数据\n // 返回取消订阅函数\n return () => {};\n }\n\n async test(config) {\n // 测试连接是否可用\n try {\n await this.fetchData(config);\n return { success: true, message: '连接成功' };\n } catch (e) {\n return { success: false, message: e.message };\n }\n }\n}\n\nexport default defineDataSourceExtension({\n type: '${name}',\n name: '${name} 数据源',\n adapter: new ${pascalCase(name)}Adapter(),\n configSchema,\n defaults,\n description: '${name} 自定义数据源',\n});\n`,\n 'src/schema.js': `export default [\n {\n key: 'url',\n label: '接口地址',\n type: 'text',\n group: '基础',\n default: 'https://api.example.com/data',\n required: true,\n },\n {\n key: 'method',\n label: '请求方法',\n type: 'select',\n group: '基础',\n default: 'GET',\n options: [\n { label: 'GET', value: 'GET' },\n { label: 'POST', value: 'POST' },\n ],\n },\n {\n key: 'headers',\n label: '请求头',\n type: 'json',\n group: '高级',\n default: {},\n },\n];\n`,\n 'src/defaults.js': `export default {\n url: 'https://api.example.com/data',\n method: 'GET',\n headers: {},\n params: {},\n};\n`,\n };\n}\n\nfunction pascalCase(str) {\n return str.replace(/(^|[^a-zA-Z0-9])([a-z])/g, (_, __, c) => c.toUpperCase());\n}\n","/**\n * 模板扩展模板\n */\nexport function templateTemplate(name) {\n return {\n 'src/index.js': `import { defineTemplateExtension } from '@nbreak/sdk';\nimport pages from './pages.js';\n\nexport default defineTemplateExtension({\n id: '${name}',\n name: '${name} 模板',\n pages,\n thumbnail: '',\n canvasConfig: {\n width: 1920,\n height: 1080,\n background: '#0a1628',\n },\n description: '${name} 自定义模板',\n});\n`,\n 'src/pages.js': `export default [\n {\n id: 'page-1',\n name: '主页面',\n components: [\n {\n id: 'comp-title',\n type: 'text',\n x: 0,\n y: 0,\n width: 1920,\n height: 80,\n props: {\n content: '${name}',\n fontSize: 32,\n color: '#1890ff',\n textAlign: 'center',\n },\n },\n ],\n },\n];\n`,\n };\n}\n","/**\n * 动作扩展模板\n */\nexport function actionTemplate(name) {\n return {\n 'src/index.js': `import { defineActionExtension } from '@nbreak/sdk';\nimport schema from './schema.js';\n\nasync function handler(params, context) {\n // params: 用户配置的动作参数\n // context: { componentId, event, data, store, eventBus }\n // TODO: 实现 ${name} 动作逻辑\n\n console.log('[${name} Action]', { params, context });\n\n // 示例:更新组件数据\n if (context.componentId && params.targetData) {\n context.eventBus.emit('component:updateData', {\n componentId: context.componentId,\n data: params.targetData,\n });\n }\n\n return { success: true };\n}\n\nexport default defineActionExtension({\n actionType: '${name}',\n handler,\n schema,\n category: 'general',\n description: '${name} 自定义动作',\n});\n`,\n 'src/schema.js': `export default [\n {\n key: 'targetData',\n label: '目标数据',\n type: 'json',\n group: '参数',\n default: {},\n },\n {\n key: 'message',\n label: '提示消息',\n type: 'text',\n group: '参数',\n default: '',\n },\n];\n`,\n };\n}\n","/**\n * 属性字段扩展模板\n */\nexport function propertyFieldTemplate(name) {\n return {\n 'src/index.js': `import { definePropertyFieldExtension } from '@nbreak/sdk';\nimport Editor from './Editor.vue';\n\nexport default definePropertyFieldExtension({\n fieldType: '${name}',\n editor: Editor,\n defaultValue: () => null,\n serialize: (value) => value,\n deserialize: (value) => value,\n description: '${name} 自定义属性编辑器',\n});\n`,\n 'src/Editor.vue': `<template>\n <div class=\"ds-field-${name}\">\n <input\n :value=\"modelValue\"\n @input=\"$emit('update:modelValue', $event.target.value)\"\n :placeholder=\"placeholder\"\n class=\"ds-field-input\"\n />\n </div>\n</template>\n\n<script setup>\ndefineProps({\n modelValue: { default: null },\n field: { type: Object, default: () => ({}) },\n placeholder: { type: String, default: '' },\n});\n\ndefineEmits(['update:modelValue']);\n</script>\n\n<style scoped>\n.ds-field-${name} {\n width: 100%;\n}\n\n.ds-field-input {\n width: 100%;\n padding: 4px 8px;\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 4px;\n background: rgba(0,0,0,0.2);\n color: inherit;\n font-size: 13px;\n}\n\n.ds-field-input:focus {\n outline: none;\n border-color: #1890ff;\n}\n</style>\n`,\n };\n}\n","/**\n * 共享模板文件(所有扩展类型都有)\n */\n\nexport function sharedFiles(name, type) {\n const pkgName = name.startsWith('@') ? name : `datascreen-${type}-${name}`;\n\n return {\n 'package.json': JSON.stringify({\n name: pkgName,\n version: '0.1.0',\n description: `DataScreen ${type} extension: ${name}`,\n type: 'module',\n main: './dist/index.js',\n module: './dist/index.mjs',\n types: './dist/index.d.ts',\n files: ['dist', 'datascreen.extension.json'],\n scripts: {\n build: 'vite build',\n dev: 'vite build --watch',\n },\n datascreen: {\n type,\n displayName: name,\n },\n dependencies: {\n '@nbreak/sdk': '^0.1.0',\n },\n peerDependencies: {\n '@nbreak/core': '^0.1.0',\n },\n publishConfig: {\n access: 'public',\n },\n }, null, 2) + '\\n',\n\n 'datascreen.extension.json': JSON.stringify({\n name: pkgName,\n version: '0.1.0',\n type,\n entry: './dist/index.js',\n module: './dist/index.mjs',\n types: './dist/index.d.ts',\n datascreenVersion: '>=0.1.0',\n dependencies: {\n '@nbreak/core': '^0.1.0',\n },\n displayName: name,\n description: `DataScreen ${type} extension`,\n }, null, 2) + '\\n',\n\n 'vite.config.js': `import { defineConfig } from 'vite';\n\nexport default defineConfig({\n build: {\n outDir: 'dist',\n sourcemap: true,\n target: 'es2020',\n minify: false,\n lib: {\n entry: 'src/index.js',\n formats: ['es', 'cjs'],\n fileName: (format) => format === 'es' ? 'index.mjs' : 'index.js',\n },\n rollupOptions: {\n external: ['@nbreak/sdk', '@nbreak/core', '@nbreak/shared', 'vue'],\n output: { exports: 'named' },\n },\n },\n});\n`,\n\n '.gitignore': `node_modules/\ndist/\n*.tgz\n.DS_Store\n`,\n\n 'README.md': `# ${pkgName}\n\nDataScreen ${type} extension: ${name}\n\n## 开发\n\n\\`\\`\\`bash\npnpm install\npnpm build\n\\`\\`\\`\n\n## 发布\n\n\\`\\`\\`bash\nnpm publish\n\\`\\`\\`\n`,\n };\n}\n","/**\n * 扩展项目模板生成器\n *\n * 为 6 种扩展类型生成完整的项目脚手架\n */\n\nimport { componentTemplate } from './component.js';\nimport { themeTemplate } from './theme.js';\nimport { datasourceTemplate } from './datasource.js';\nimport { templateTemplate } from './template.js';\nimport { actionTemplate } from './action.js';\nimport { propertyFieldTemplate } from './propertyField.js';\nimport { sharedFiles } from './shared.js';\n\nconst TEMPLATE_MAP = {\n component: componentTemplate,\n theme: themeTemplate,\n datasource: datasourceTemplate,\n template: templateTemplate,\n action: actionTemplate,\n 'property-field': propertyFieldTemplate,\n};\n\n/**\n * 生成扩展项目模板\n * @param {string} type - 扩展类型\n * @param {string} name - 扩展名称\n * @returns {Object} 文件路径到内容的映射\n */\nexport function generateExtensionTemplate(type, name) {\n const generator = TEMPLATE_MAP[type];\n if (!generator) {\n throw new Error(`未知扩展类型: ${type}`);\n }\n\n const specificFiles = generator(name);\n const commonFiles = sharedFiles(name, type);\n\n return { ...commonFiles, ...specificFiles };\n}\n","/**\n * datascreen init <type> <name> [path]\n *\n * 脚手架生成扩展项目\n */\nimport { mkdirSync, writeFileSync, existsSync } from 'node:fs';\nimport { resolve, join, dirname } from 'node:path';\nimport { ALL_EXTENSION_TYPES } from '@nbreak/shared';\nimport { generateExtensionTemplate } from '../../templates/index.js';\n\nexport function initCommand(args) {\n const [type, name, targetPath] = args;\n\n if (!type || !name) {\n console.error('用法: datascreen init <type> <name> [path]');\n console.error(`type 可选: ${ALL_EXTENSION_TYPES.join(', ')}`);\n process.exit(1);\n }\n\n if (!ALL_EXTENSION_TYPES.includes(type)) {\n console.error(`无效的扩展类型: ${type}`);\n console.error(`可选类型: ${ALL_EXTENSION_TYPES.join(', ')}`);\n process.exit(1);\n }\n\n const target = resolve(process.cwd(), targetPath || name);\n\n if (existsSync(target)) {\n console.error(`目标目录已存在: ${target}`);\n process.exit(1);\n }\n\n console.log(`正在生成 ${type} 扩展: ${name}`);\n console.log(`目标目录: ${target}`);\n\n const files = generateExtensionTemplate(type, name);\n\n for (const [filePath, content] of Object.entries(files)) {\n const fullPath = join(target, filePath);\n const dir = dirname(fullPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(fullPath, content, 'utf-8');\n console.log(` 创建: ${filePath}`);\n }\n\n console.log('\\n扩展项目已生成!');\n console.log('\\n后续步骤:');\n console.log(` cd ${name}`);\n console.log(` pnpm install`);\n console.log(` pnpm build`);\n console.log(` npm publish # 发布到 npm`);\n}\n","/**\n * @nbreak/sdk - Node-only Manifest 工具\n *\n * 这些函数依赖 node:fs / node:path,只能在 Node 环境(CLI / 服务端)使用。\n * 浏览器侧请使用 manifest.js 中的 checkCompatibility / generateManifestTemplate。\n *\n * 拆分原因:原本与浏览器安全函数混在 manifest.js 中,\n * 顶层 `import 'node:fs'` 会被 Vite 静态打包并 externalize,\n * 导致浏览器运行时抛出 \"Module node:fs has been externalized for browser\" 错误。\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { createManifest, validateManifest } from '@nbreak/shared';\n\n/**\n * 从文件读取 manifest\n * @param {string} manifestPath - datascreen.extension.json 路径\n * @returns {Object|null}\n */\nexport function readManifest(manifestPath) {\n const absPath = resolve(process.cwd(), manifestPath);\n if (!existsSync(absPath)) return null;\n try {\n const content = readFileSync(absPath, 'utf-8');\n return JSON.parse(content);\n } catch (e) {\n console.error(`[DataScreen SDK] 读取 manifest 失败: ${manifestPath}`, e);\n return null;\n }\n}\n\n/**\n * 写入 manifest 到文件\n * @param {string} manifestPath\n * @param {Object} manifest\n */\nexport function writeManifest(manifestPath, manifest) {\n const absPath = resolve(process.cwd(), manifestPath);\n const content = JSON.stringify(manifest, null, 2) + '\\n';\n writeFileSync(absPath, content, 'utf-8');\n return absPath;\n}\n\n/**\n * 从 package.json 推导 manifest\n * @param {string} packageJsonPath\n * @returns {Object}\n */\nexport function deriveManifestFromPackageJson(packageJsonPath = 'package.json') {\n const absPath = resolve(process.cwd(), packageJsonPath);\n if (!existsSync(absPath)) {\n throw new Error(`package.json 不存在: ${absPath}`);\n }\n const pkg = JSON.parse(readFileSync(absPath, 'utf-8'));\n\n const datascreenConfig = pkg.datascreen || {};\n return createManifest({\n name: pkg.name,\n version: pkg.version,\n type: datascreenConfig.type || 'component',\n entry: datascreenConfig.entry || (pkg.main || './dist/index.js'),\n module: datascreenConfig.module || (pkg.module || './dist/index.mjs'),\n types: datascreenConfig.types || (pkg.types || './dist/index.d.ts'),\n datascreenVersion: datascreenConfig.datascreenVersion || '>=0.1.0',\n dependencies: datascreenConfig.dependencies || {},\n displayName: datascreenConfig.displayName || pkg.name,\n description: pkg.description || '',\n author: typeof pkg.author === 'string' ? pkg.author : (pkg.author?.name || ''),\n license: pkg.license || '',\n keywords: pkg.keywords || [],\n schema: datascreenConfig.schema || {},\n });\n}\n\n/**\n * 校验 manifest 文件\n * @param {string} manifestPath\n * @returns {{valid: boolean, errors: Array, warnings: Array, manifest: Object|null}}\n */\nexport function validateManifestFile(manifestPath) {\n const manifest = readManifest(manifestPath);\n if (!manifest) {\n return {\n valid: false,\n errors: [`无法读取 manifest 文件: ${manifestPath}`],\n warnings: [],\n manifest: null,\n };\n }\n const result = validateManifest(manifest);\n return { ...result, manifest };\n}\n","/**\n * datascreen build [path]\n *\n * 构建扩展包\n * 调用 Vite 库模式构建,自动注入 manifest\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { validateManifestFile } from '../../manifest-node.js';\n\nexport function buildCommand(args) {\n const [targetPath = '.'] = args;\n const cwd = resolve(process.cwd(), targetPath);\n\n // 检查 manifest\n const manifestPath = join(cwd, 'datascreen.extension.json');\n if (existsSync(manifestPath)) {\n console.log('校验 manifest...');\n const result = validateManifestFile(manifestPath);\n if (!result.valid) {\n console.error('manifest 校验失败:');\n result.errors.forEach(e => console.error(` - ${e}`));\n process.exit(1);\n }\n if (result.warnings.length > 0) {\n console.warn('manifest 警告:');\n result.warnings.forEach(w => console.warn(` - ${w}`));\n }\n console.log('manifest 校验通过');\n } else {\n console.warn('未找到 datascreen.extension.json,跳过 manifest 校验');\n }\n\n // 检查 vite.config.js\n const viteConfigPath = join(cwd, 'vite.config.js');\n if (!existsSync(viteConfigPath)) {\n console.error('未找到 vite.config.js,无法构建');\n console.error('请确保在扩展项目根目录运行此命令,或使用 datascreen init 生成项目');\n process.exit(1);\n }\n\n // 检查 package.json\n const pkgPath = join(cwd, 'package.json');\n if (!existsSync(pkgPath)) {\n console.error('未找到 package.json');\n process.exit(1);\n }\n\n console.log('开始构建...');\n const result = spawnSync('npx', ['vite', 'build'], {\n cwd,\n stdio: 'inherit',\n shell: true,\n });\n\n if (result.status !== 0) {\n console.error('构建失败');\n process.exit(result.status || 1);\n }\n\n console.log('构建成功!');\n\n // 如果有 manifest,复制到 dist\n if (existsSync(manifestPath)) {\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n console.log(`扩展: ${manifest.name}@${manifest.version} (${manifest.type})`);\n }\n}\n\nfunction join(...paths) {\n return paths.reduce((acc, p) => acc + '/' + p).replace(/\\/+/g, '/');\n}\n","/**\n * datascreen pack [path]\n *\n * 打包扩展为 npm tarball\n */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { validateManifestFile } from '../../manifest-node.js';\n\nexport function packCommand(args) {\n const [targetPath = '.'] = args;\n const cwd = resolve(process.cwd(), targetPath);\n\n // 校验 manifest\n const manifestPath = join(cwd, 'datascreen.extension.json');\n if (existsSync(manifestPath)) {\n console.log('校验 manifest...');\n const result = validateManifestFile(manifestPath);\n if (!result.valid) {\n console.error('manifest 校验失败:');\n result.errors.forEach(e => console.error(` - ${e}`));\n process.exit(1);\n }\n console.log('manifest 校验通过');\n }\n\n // 检查 dist 目录\n const distPath = join(cwd, 'dist');\n if (!existsSync(distPath)) {\n console.error('未找到 dist 目录,请先运行 datascreen build');\n process.exit(1);\n }\n\n // 复制 manifest 到 dist\n if (existsSync(manifestPath)) {\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n writeFileSync(\n join(distPath, 'datascreen.extension.json'),\n JSON.stringify(manifest, null, 2),\n 'utf-8'\n );\n console.log('已复制 manifest 到 dist');\n }\n\n console.log('打包中...');\n const result = spawnSync('npm', ['pack'], {\n cwd,\n stdio: 'inherit',\n shell: true,\n });\n\n if (result.status !== 0) {\n console.error('打包失败');\n process.exit(result.status || 1);\n }\n\n console.log('打包成功!');\n console.log('生成文件: <name>-<version>.tgz');\n console.log('发布到 npm: npm publish');\n}\n\nfunction join(...paths) {\n return paths.reduce((acc, p) => acc + '/' + p).replace(/\\/+/g, '/');\n}\n","/**\n * datascreen list\n *\n * 列出当前项目的扩展信息\n */\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport function listCommand(args) {\n const [targetPath = '.'] = args;\n const cwd = resolve(process.cwd(), targetPath);\n\n // 查找 manifest\n const manifestPath = join(cwd, 'datascreen.extension.json');\n const pkgPath = join(cwd, 'package.json');\n\n let manifest = null;\n let pkg = null;\n\n if (existsSync(manifestPath)) {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n }\n if (existsSync(pkgPath)) {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n }\n\n if (!manifest && !pkg) {\n console.error('未找到 datascreen.extension.json 或 package.json');\n process.exit(1);\n }\n\n console.log('\\n=== DataScreen 扩展信息 ===\\n');\n\n if (manifest) {\n console.log(`名称: ${manifest.name}`);\n console.log(`版本: ${manifest.version}`);\n console.log(`类型: ${manifest.type}`);\n console.log(`入口: ${manifest.entry}`);\n console.log(`显示名: ${manifest.displayName || manifest.name}`);\n console.log(`描述: ${manifest.description || '-'}`);\n console.log(`兼容版本: ${manifest.datascreenVersion || '-'}`);\n } else if (pkg) {\n console.log(`包名: ${pkg.name}`);\n console.log(`版本: ${pkg.version}`);\n const ds = pkg.datascreen || {};\n console.log(`类型: ${ds.type || '(未声明)'}`);\n console.log(`入口: ${pkg.main || '-'}`);\n }\n\n // 列出 dist 中的文件\n const distPath = join(cwd, 'dist');\n if (existsSync(distPath)) {\n const files = readdirSync(distPath);\n console.log(`\\n构建产物 (${distPath}):`);\n files.forEach(f => console.log(` - ${f}`));\n } else {\n console.log('\\n(未构建,运行 datascreen build)');\n }\n}\n\nfunction join(...paths) {\n return paths.reduce((acc, p) => acc + '/' + p).replace(/\\/+/g, '/');\n}\n","/**\n * datascreen validate [manifestPath]\n *\n * 校验 manifest 文件\n */\nimport { validateManifestFile } from '../../manifest-node.js';\n\nexport function validateCommand(args) {\n const [manifestPath = 'datascreen.extension.json'] = args;\n\n console.log(`校验 manifest: ${manifestPath}`);\n const result = validateManifestFile(manifestPath);\n\n if (result.errors.length > 0) {\n console.error('\\n错误:');\n result.errors.forEach(e => console.error(` ✗ ${e}`));\n }\n\n if (result.warnings.length > 0) {\n console.warn('\\n警告:');\n result.warnings.forEach(w => console.warn(` ⚠ ${w}`));\n }\n\n if (result.valid) {\n console.log('\\n✓ manifest 校验通过');\n if (result.manifest) {\n console.log(` 名称: ${result.manifest.name}`);\n console.log(` 版本: ${result.manifest.version}`);\n console.log(` 类型: ${result.manifest.type}`);\n }\n process.exit(0);\n } else {\n console.log('\\n✗ manifest 校验失败');\n process.exit(1);\n }\n}\n","/**\n * DataScreen CLI 主入口\n */\nimport { initCommand } from './commands/init.js';\nimport { buildCommand } from './commands/build.js';\nimport { packCommand } from './commands/pack.js';\nimport { listCommand } from './commands/list.js';\nimport { validateCommand } from './commands/validate.js';\n\nconst VERSION = '0.1.0';\n\nconst HELP_TEXT = `\nDataScreen CLI v${VERSION}\n\n用法:\n datascreen <command> [options]\n\n命令:\n init <type> <name> [path] 生成扩展项目(type: component/theme/datasource/template/action/property-field)\n build [path] 构建扩展包\n pack [path] 打包为 npm tarball\n list 列出当前项目的扩展\n validate [manifestPath] 校验 manifest 文件\n\n示例:\n datascreen init component my-chart\n datascreen init theme my-theme ./packages/my-theme\n datascreen build\n datascreen pack\n datascreen validate ./datascreen.extension.json\n\n选项:\n -h, --help 显示帮助\n -v, --version 显示版本\n`;\n\nexport function runCli(args) {\n const [command, ...rest] = args;\n\n if (!command || command === '-h' || command === '--help') {\n console.log(HELP_TEXT);\n return;\n }\n\n if (command === '-v' || command === '--version') {\n console.log(VERSION);\n return;\n }\n\n const commands = {\n init: initCommand,\n build: buildCommand,\n pack: packCommand,\n list: listCommand,\n validate: validateCommand,\n };\n\n const handler = commands[command];\n if (!handler) {\n console.error(`未知命令: ${command}`);\n console.log(HELP_TEXT);\n process.exit(1);\n }\n\n handler(rest);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { COMPONENT_CATEGORIES, EXTENSION_TYPES, EXTENSION_TYPES as EXTENSION_TYPES$1, PROPERTY_FIELD_TYPES, createManifest, definePropertyField, definePropertyGroup, groupFields, isVersionCompatible, resolveDefaults, validateField } from "@nbreak/shared";
|
|
2
|
+
import { extensionRegistry } from "@nbreak/core";
|
|
3
|
+
//#region src/define.js
|
|
4
|
+
/**
|
|
5
|
+
* @nbreak/sdk - 扩展定义 API
|
|
6
|
+
*
|
|
7
|
+
* 提供 6 个 define* 工厂函数,每个返回标准 Extension 对象
|
|
8
|
+
* 应用方通过 import 这些函数定义扩展,然后注册到 extensionRegistry
|
|
9
|
+
*
|
|
10
|
+
* 对标:
|
|
11
|
+
* - Superset: defineChartPlugin() / defineDashboardPlugin()
|
|
12
|
+
* - DataV: 自定义组件开发 API
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* 定义组件扩展
|
|
16
|
+
* @param {Object} def - 组件扩展定义
|
|
17
|
+
* @param {string} def.type - 组件类型标识
|
|
18
|
+
* @param {string} def.name - 显示名称
|
|
19
|
+
* @param {string} def.category - 分类
|
|
20
|
+
* @param {Function|Object} def.component - Vue 组件或异步加载函数
|
|
21
|
+
* @param {Array} [def.schema] - 属性字段数组
|
|
22
|
+
* @param {Object} [def.defaults] - 默认配置
|
|
23
|
+
* @param {Array<string>} [def.tags] - 标签
|
|
24
|
+
* @param {string} [def.icon] - 图标
|
|
25
|
+
* @param {string} [def.thumbnail] - 缩略图
|
|
26
|
+
* @param {string} [def.description] - 描述
|
|
27
|
+
* @returns {Object} Extension 对象
|
|
28
|
+
*/
|
|
29
|
+
function defineComponentExtension(def) {
|
|
30
|
+
if (!def || !def.type) throw new Error("[DataScreen SDK] defineComponentExtension 需要 type 字段");
|
|
31
|
+
return {
|
|
32
|
+
type: EXTENSION_TYPES$1.COMPONENT,
|
|
33
|
+
name: def.name || def.type,
|
|
34
|
+
displayName: def.name || def.type,
|
|
35
|
+
description: def.description || "",
|
|
36
|
+
icon: def.icon || "AppstoreOutlined",
|
|
37
|
+
thumbnail: def.thumbnail || "",
|
|
38
|
+
definition: {
|
|
39
|
+
type: def.type,
|
|
40
|
+
name: def.name || def.type,
|
|
41
|
+
category: def.category || "other",
|
|
42
|
+
component: def.component,
|
|
43
|
+
schema: def.schema || [],
|
|
44
|
+
defaults: def.defaults || {},
|
|
45
|
+
tags: def.tags || [],
|
|
46
|
+
icon: def.icon || "AppstoreOutlined",
|
|
47
|
+
thumbnail: def.thumbnail || "",
|
|
48
|
+
description: def.description || ""
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 定义主题扩展
|
|
54
|
+
* @param {Object} def
|
|
55
|
+
* @param {string} def.id - 主题 ID
|
|
56
|
+
* @param {string} def.name - 显示名称
|
|
57
|
+
* @param {Object} def.tokens - 主题令牌(CSS 变量映射)
|
|
58
|
+
* @param {string} [def.preview] - 预览图
|
|
59
|
+
* @param {boolean} [def.isDark] - 是否深色主题
|
|
60
|
+
* @returns {Object} Extension 对象
|
|
61
|
+
*/
|
|
62
|
+
function defineThemeExtension(def) {
|
|
63
|
+
if (!def || !def.id) throw new Error("[DataScreen SDK] defineThemeExtension 需要 id 字段");
|
|
64
|
+
return {
|
|
65
|
+
type: EXTENSION_TYPES$1.THEME,
|
|
66
|
+
name: def.id,
|
|
67
|
+
displayName: def.name || def.id,
|
|
68
|
+
description: def.description || "",
|
|
69
|
+
icon: "BgColorsOutlined",
|
|
70
|
+
thumbnail: def.preview || "",
|
|
71
|
+
definition: {
|
|
72
|
+
id: def.id,
|
|
73
|
+
name: def.name || def.id,
|
|
74
|
+
tokens: def.tokens || {},
|
|
75
|
+
preview: def.preview || "",
|
|
76
|
+
isDark: def.isDark !== void 0 ? def.isDark : true,
|
|
77
|
+
description: def.description || ""
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 定义数据源扩展
|
|
83
|
+
* @param {Object} def
|
|
84
|
+
* @param {string} def.type - 数据源类型
|
|
85
|
+
* @param {string} def.name - 显示名称
|
|
86
|
+
* @param {Object} def.adapter - 适配器实例(实现 fetchData/subscribe/test)
|
|
87
|
+
* @param {Array} [def.configSchema] - 配置字段
|
|
88
|
+
* @param {Object} [def.defaults] - 默认配置
|
|
89
|
+
* @returns {Object} Extension 对象
|
|
90
|
+
*/
|
|
91
|
+
function defineDataSourceExtension(def) {
|
|
92
|
+
if (!def || !def.type) throw new Error("[DataScreen SDK] defineDataSourceExtension 需要 type 字段");
|
|
93
|
+
if (!def.adapter || typeof def.adapter.fetchData !== "function") throw new Error("[DataScreen SDK] adapter 必须实现 fetchData 方法");
|
|
94
|
+
return {
|
|
95
|
+
type: EXTENSION_TYPES$1.DATASOURCE,
|
|
96
|
+
name: def.name || def.type,
|
|
97
|
+
displayName: def.name || def.type,
|
|
98
|
+
description: def.description || "",
|
|
99
|
+
icon: "DatabaseOutlined",
|
|
100
|
+
definition: {
|
|
101
|
+
type: def.type,
|
|
102
|
+
name: def.name || def.type,
|
|
103
|
+
adapter: def.adapter,
|
|
104
|
+
configSchema: def.configSchema || [],
|
|
105
|
+
defaults: def.defaults || {},
|
|
106
|
+
description: def.description || ""
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 定义模板扩展
|
|
112
|
+
* @param {Object} def
|
|
113
|
+
* @param {string} def.id - 模板 ID
|
|
114
|
+
* @param {string} def.name - 显示名称
|
|
115
|
+
* @param {Array} def.pages - 页面定义
|
|
116
|
+
* @param {string} [def.thumbnail] - 缩略图
|
|
117
|
+
* @param {Object} [def.canvasConfig] - 画布配置
|
|
118
|
+
* @returns {Object} Extension 对象
|
|
119
|
+
*/
|
|
120
|
+
function defineTemplateExtension(def) {
|
|
121
|
+
if (!def || !def.id) throw new Error("[DataScreen SDK] defineTemplateExtension 需要 id 字段");
|
|
122
|
+
if (!Array.isArray(def.pages)) throw new Error("[DataScreen SDK] defineTemplateExtension 需要 pages 数组");
|
|
123
|
+
return {
|
|
124
|
+
type: EXTENSION_TYPES$1.TEMPLATE,
|
|
125
|
+
name: def.id,
|
|
126
|
+
displayName: def.name || def.id,
|
|
127
|
+
description: def.description || "",
|
|
128
|
+
icon: "LayoutOutlined",
|
|
129
|
+
thumbnail: def.thumbnail || "",
|
|
130
|
+
definition: {
|
|
131
|
+
id: def.id,
|
|
132
|
+
name: def.name || def.id,
|
|
133
|
+
pages: def.pages,
|
|
134
|
+
thumbnail: def.thumbnail || "",
|
|
135
|
+
canvasConfig: def.canvasConfig || {},
|
|
136
|
+
description: def.description || ""
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 定义动作扩展
|
|
142
|
+
* @param {Object} def
|
|
143
|
+
* @param {string} def.actionType - 动作类型
|
|
144
|
+
* @param {Function} def.handler - 处理函数 (params, context) => result
|
|
145
|
+
* @param {Array} [def.schema] - 参数字段
|
|
146
|
+
* @param {string} [def.category] - 动作分类
|
|
147
|
+
* @returns {Object} Extension 对象
|
|
148
|
+
*/
|
|
149
|
+
function defineActionExtension(def) {
|
|
150
|
+
if (!def || !def.actionType) throw new Error("[DataScreen SDK] defineActionExtension 需要 actionType 字段");
|
|
151
|
+
if (typeof def.handler !== "function") throw new Error("[DataScreen SDK] defineActionExtension 需要 handler 函数");
|
|
152
|
+
return {
|
|
153
|
+
type: EXTENSION_TYPES$1.ACTION,
|
|
154
|
+
name: def.actionType,
|
|
155
|
+
displayName: def.displayName || def.actionType,
|
|
156
|
+
description: def.description || "",
|
|
157
|
+
icon: "ThunderboltOutlined",
|
|
158
|
+
definition: {
|
|
159
|
+
actionType: def.actionType,
|
|
160
|
+
handler: def.handler,
|
|
161
|
+
schema: def.schema || [],
|
|
162
|
+
category: def.category || "general",
|
|
163
|
+
description: def.description || ""
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 定义属性字段扩展
|
|
169
|
+
* @param {Object} def
|
|
170
|
+
* @param {string} def.fieldType - 字段类型标识
|
|
171
|
+
* @param {Function|Object} def.editor - Vue 编辑器组件
|
|
172
|
+
* @param {Function} [def.defaultValue] - 默认值生成函数
|
|
173
|
+
* @param {Function} [def.serialize] - 序列化函数
|
|
174
|
+
* @param {Function} [def.deserialize] - 反序列化函数
|
|
175
|
+
* @returns {Object} Extension 对象
|
|
176
|
+
*/
|
|
177
|
+
function definePropertyFieldExtension(def) {
|
|
178
|
+
if (!def || !def.fieldType) throw new Error("[DataScreen SDK] definePropertyFieldExtension 需要 fieldType 字段");
|
|
179
|
+
if (!def.editor) throw new Error("[DataScreen SDK] definePropertyFieldExtension 需要 editor 组件");
|
|
180
|
+
return {
|
|
181
|
+
type: EXTENSION_TYPES$1.PROPERTY_FIELD,
|
|
182
|
+
name: def.fieldType,
|
|
183
|
+
displayName: def.displayName || def.fieldType,
|
|
184
|
+
description: def.description || "",
|
|
185
|
+
icon: "FormOutlined",
|
|
186
|
+
definition: {
|
|
187
|
+
fieldType: def.fieldType,
|
|
188
|
+
editor: def.editor,
|
|
189
|
+
defaultValue: def.defaultValue,
|
|
190
|
+
serialize: def.serialize,
|
|
191
|
+
deserialize: def.deserialize,
|
|
192
|
+
description: def.description || ""
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 统一定义入口(根据 type 自动分发)
|
|
198
|
+
*/
|
|
199
|
+
function defineExtension(def) {
|
|
200
|
+
if (!def || !def.type) throw new Error("[DataScreen SDK] defineExtension 需要 type 字段");
|
|
201
|
+
switch (def.type) {
|
|
202
|
+
case EXTENSION_TYPES$1.COMPONENT: return defineComponentExtension(def);
|
|
203
|
+
case EXTENSION_TYPES$1.THEME: return defineThemeExtension(def);
|
|
204
|
+
case EXTENSION_TYPES$1.DATASOURCE: return defineDataSourceExtension(def);
|
|
205
|
+
case EXTENSION_TYPES$1.TEMPLATE: return defineTemplateExtension(def);
|
|
206
|
+
case EXTENSION_TYPES$1.ACTION: return defineActionExtension(def);
|
|
207
|
+
case EXTENSION_TYPES$1.PROPERTY_FIELD: return definePropertyFieldExtension(def);
|
|
208
|
+
default: throw new Error(`[DataScreen SDK] 未知扩展类型: ${def.type}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//#endregion
|
|
212
|
+
//#region src/manifest.js
|
|
213
|
+
/**
|
|
214
|
+
* @nbreak/sdk - Manifest 工具(浏览器安全子集)
|
|
215
|
+
*
|
|
216
|
+
* 仅保留不依赖 node:fs / node:path 的函数:
|
|
217
|
+
* - checkCompatibility:版本兼容性检查
|
|
218
|
+
* - generateManifestTemplate:生成 manifest 模板对象
|
|
219
|
+
*
|
|
220
|
+
* 依赖文件系统的函数(readManifest / writeManifest / deriveManifestFromPackageJson /
|
|
221
|
+
* validateManifestFile)已迁移至 ./manifest-node.js,仅供 Node 环境(CLI)使用。
|
|
222
|
+
*
|
|
223
|
+
* 拆分原因:原 manifest.js 顶层 `import 'node:fs'` 会被 Vite 静态打包并 externalize,
|
|
224
|
+
* 导致浏览器运行时抛出 "Module node:fs has been externalized for browser" 错误。
|
|
225
|
+
* 浏览器侧代码(themes / datasources / ui / vue)通过 @nbreak/sdk 主入口
|
|
226
|
+
* 引入 define* 工厂时,不应触发 node:fs 加载。
|
|
227
|
+
*/
|
|
228
|
+
/**
|
|
229
|
+
* 检查扩展与宿主版本兼容性
|
|
230
|
+
* @param {Object} manifest
|
|
231
|
+
* @param {string} hostVersion
|
|
232
|
+
* @returns {{compatible: boolean, reason: string}}
|
|
233
|
+
*/
|
|
234
|
+
function checkCompatibility(manifest, hostVersion) {
|
|
235
|
+
if (!manifest.datascreenVersion) return {
|
|
236
|
+
compatible: true,
|
|
237
|
+
reason: "未声明版本要求"
|
|
238
|
+
};
|
|
239
|
+
if (!hostVersion) return {
|
|
240
|
+
compatible: true,
|
|
241
|
+
reason: "宿主版本未知,跳过检查"
|
|
242
|
+
};
|
|
243
|
+
const compatible = isVersionCompatible(manifest.datascreenVersion, hostVersion);
|
|
244
|
+
return {
|
|
245
|
+
compatible,
|
|
246
|
+
reason: compatible ? "版本兼容" : `扩展要求 ${manifest.datascreenVersion},当前 ${hostVersion}`
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 生成 manifest 模板
|
|
251
|
+
* @param {string} type - 扩展类型
|
|
252
|
+
* @param {string} name - 扩展名称
|
|
253
|
+
* @param {Object} [extra]
|
|
254
|
+
* @returns {Object}
|
|
255
|
+
*/
|
|
256
|
+
function generateManifestTemplate(type, name, extra = {}) {
|
|
257
|
+
return createManifest({
|
|
258
|
+
name,
|
|
259
|
+
type,
|
|
260
|
+
...extra
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
//#endregion
|
|
264
|
+
//#region src/index.js
|
|
265
|
+
var VERSION = "0.1.0";
|
|
266
|
+
var PACKAGE_NAME = "@nbreak/sdk";
|
|
267
|
+
/**
|
|
268
|
+
* 批量注册扩展(便捷 API)
|
|
269
|
+
* @param {Array} extensions
|
|
270
|
+
* @returns {Promise<Array<boolean>>}
|
|
271
|
+
*/
|
|
272
|
+
async function registerExtensions(extensions) {
|
|
273
|
+
const { extensionRegistry } = await import("@nbreak/core");
|
|
274
|
+
return extensionRegistry.registerAll(extensions);
|
|
275
|
+
}
|
|
276
|
+
//#endregion
|
|
277
|
+
export { COMPONENT_CATEGORIES, EXTENSION_TYPES, PACKAGE_NAME, PROPERTY_FIELD_TYPES, VERSION, checkCompatibility, defineActionExtension, defineComponentExtension, defineDataSourceExtension, defineExtension, definePropertyField, definePropertyFieldExtension, definePropertyGroup, defineTemplateExtension, defineThemeExtension, extensionRegistry, generateManifestTemplate, groupFields, registerExtensions, resolveDefaults, validateField };
|
|
278
|
+
|
|
279
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["EXTENSION_TYPES"],"sources":["../../src/define.js","../../src/manifest.js","../../src/index.js"],"sourcesContent":["/**\n * @nbreak/sdk - 扩展定义 API\n *\n * 提供 6 个 define* 工厂函数,每个返回标准 Extension 对象\n * 应用方通过 import 这些函数定义扩展,然后注册到 extensionRegistry\n *\n * 对标:\n * - Superset: defineChartPlugin() / defineDashboardPlugin()\n * - DataV: 自定义组件开发 API\n */\n\nimport { EXTENSION_TYPES } from '@nbreak/shared';\n\n/**\n * 定义组件扩展\n * @param {Object} def - 组件扩展定义\n * @param {string} def.type - 组件类型标识\n * @param {string} def.name - 显示名称\n * @param {string} def.category - 分类\n * @param {Function|Object} def.component - Vue 组件或异步加载函数\n * @param {Array} [def.schema] - 属性字段数组\n * @param {Object} [def.defaults] - 默认配置\n * @param {Array<string>} [def.tags] - 标签\n * @param {string} [def.icon] - 图标\n * @param {string} [def.thumbnail] - 缩略图\n * @param {string} [def.description] - 描述\n * @returns {Object} Extension 对象\n */\nexport function defineComponentExtension(def) {\n if (!def || !def.type) {\n throw new Error('[DataScreen SDK] defineComponentExtension 需要 type 字段');\n }\n return {\n type: EXTENSION_TYPES.COMPONENT,\n name: def.name || def.type,\n displayName: def.name || def.type,\n description: def.description || '',\n icon: def.icon || 'AppstoreOutlined',\n thumbnail: def.thumbnail || '',\n definition: {\n type: def.type,\n name: def.name || def.type,\n category: def.category || 'other',\n component: def.component,\n schema: def.schema || [],\n defaults: def.defaults || {},\n tags: def.tags || [],\n icon: def.icon || 'AppstoreOutlined',\n thumbnail: def.thumbnail || '',\n description: def.description || '',\n },\n };\n}\n\n/**\n * 定义主题扩展\n * @param {Object} def\n * @param {string} def.id - 主题 ID\n * @param {string} def.name - 显示名称\n * @param {Object} def.tokens - 主题令牌(CSS 变量映射)\n * @param {string} [def.preview] - 预览图\n * @param {boolean} [def.isDark] - 是否深色主题\n * @returns {Object} Extension 对象\n */\nexport function defineThemeExtension(def) {\n if (!def || !def.id) {\n throw new Error('[DataScreen SDK] defineThemeExtension 需要 id 字段');\n }\n return {\n type: EXTENSION_TYPES.THEME,\n name: def.id,\n displayName: def.name || def.id,\n description: def.description || '',\n icon: 'BgColorsOutlined',\n thumbnail: def.preview || '',\n definition: {\n id: def.id,\n name: def.name || def.id,\n tokens: def.tokens || {},\n preview: def.preview || '',\n isDark: def.isDark !== undefined ? def.isDark : true,\n description: def.description || '',\n },\n };\n}\n\n/**\n * 定义数据源扩展\n * @param {Object} def\n * @param {string} def.type - 数据源类型\n * @param {string} def.name - 显示名称\n * @param {Object} def.adapter - 适配器实例(实现 fetchData/subscribe/test)\n * @param {Array} [def.configSchema] - 配置字段\n * @param {Object} [def.defaults] - 默认配置\n * @returns {Object} Extension 对象\n */\nexport function defineDataSourceExtension(def) {\n if (!def || !def.type) {\n throw new Error('[DataScreen SDK] defineDataSourceExtension 需要 type 字段');\n }\n if (!def.adapter || typeof def.adapter.fetchData !== 'function') {\n throw new Error('[DataScreen SDK] adapter 必须实现 fetchData 方法');\n }\n return {\n type: EXTENSION_TYPES.DATASOURCE,\n name: def.name || def.type,\n displayName: def.name || def.type,\n description: def.description || '',\n icon: 'DatabaseOutlined',\n definition: {\n type: def.type,\n name: def.name || def.type,\n adapter: def.adapter,\n configSchema: def.configSchema || [],\n defaults: def.defaults || {},\n description: def.description || '',\n },\n };\n}\n\n/**\n * 定义模板扩展\n * @param {Object} def\n * @param {string} def.id - 模板 ID\n * @param {string} def.name - 显示名称\n * @param {Array} def.pages - 页面定义\n * @param {string} [def.thumbnail] - 缩略图\n * @param {Object} [def.canvasConfig] - 画布配置\n * @returns {Object} Extension 对象\n */\nexport function defineTemplateExtension(def) {\n if (!def || !def.id) {\n throw new Error('[DataScreen SDK] defineTemplateExtension 需要 id 字段');\n }\n if (!Array.isArray(def.pages)) {\n throw new Error('[DataScreen SDK] defineTemplateExtension 需要 pages 数组');\n }\n return {\n type: EXTENSION_TYPES.TEMPLATE,\n name: def.id,\n displayName: def.name || def.id,\n description: def.description || '',\n icon: 'LayoutOutlined',\n thumbnail: def.thumbnail || '',\n definition: {\n id: def.id,\n name: def.name || def.id,\n pages: def.pages,\n thumbnail: def.thumbnail || '',\n canvasConfig: def.canvasConfig || {},\n description: def.description || '',\n },\n };\n}\n\n/**\n * 定义动作扩展\n * @param {Object} def\n * @param {string} def.actionType - 动作类型\n * @param {Function} def.handler - 处理函数 (params, context) => result\n * @param {Array} [def.schema] - 参数字段\n * @param {string} [def.category] - 动作分类\n * @returns {Object} Extension 对象\n */\nexport function defineActionExtension(def) {\n if (!def || !def.actionType) {\n throw new Error('[DataScreen SDK] defineActionExtension 需要 actionType 字段');\n }\n if (typeof def.handler !== 'function') {\n throw new Error('[DataScreen SDK] defineActionExtension 需要 handler 函数');\n }\n return {\n type: EXTENSION_TYPES.ACTION,\n name: def.actionType,\n displayName: def.displayName || def.actionType,\n description: def.description || '',\n icon: 'ThunderboltOutlined',\n definition: {\n actionType: def.actionType,\n handler: def.handler,\n schema: def.schema || [],\n category: def.category || 'general',\n description: def.description || '',\n },\n };\n}\n\n/**\n * 定义属性字段扩展\n * @param {Object} def\n * @param {string} def.fieldType - 字段类型标识\n * @param {Function|Object} def.editor - Vue 编辑器组件\n * @param {Function} [def.defaultValue] - 默认值生成函数\n * @param {Function} [def.serialize] - 序列化函数\n * @param {Function} [def.deserialize] - 反序列化函数\n * @returns {Object} Extension 对象\n */\nexport function definePropertyFieldExtension(def) {\n if (!def || !def.fieldType) {\n throw new Error('[DataScreen SDK] definePropertyFieldExtension 需要 fieldType 字段');\n }\n if (!def.editor) {\n throw new Error('[DataScreen SDK] definePropertyFieldExtension 需要 editor 组件');\n }\n return {\n type: EXTENSION_TYPES.PROPERTY_FIELD,\n name: def.fieldType,\n displayName: def.displayName || def.fieldType,\n description: def.description || '',\n icon: 'FormOutlined',\n definition: {\n fieldType: def.fieldType,\n editor: def.editor,\n defaultValue: def.defaultValue,\n serialize: def.serialize,\n deserialize: def.deserialize,\n description: def.description || '',\n },\n };\n}\n\n/**\n * 统一定义入口(根据 type 自动分发)\n */\nexport function defineExtension(def) {\n if (!def || !def.type) {\n throw new Error('[DataScreen SDK] defineExtension 需要 type 字段');\n }\n switch (def.type) {\n case EXTENSION_TYPES.COMPONENT:\n return defineComponentExtension(def);\n case EXTENSION_TYPES.THEME:\n return defineThemeExtension(def);\n case EXTENSION_TYPES.DATASOURCE:\n return defineDataSourceExtension(def);\n case EXTENSION_TYPES.TEMPLATE:\n return defineTemplateExtension(def);\n case EXTENSION_TYPES.ACTION:\n return defineActionExtension(def);\n case EXTENSION_TYPES.PROPERTY_FIELD:\n return definePropertyFieldExtension(def);\n default:\n throw new Error(`[DataScreen SDK] 未知扩展类型: ${def.type}`);\n }\n}\n","/**\n * @nbreak/sdk - Manifest 工具(浏览器安全子集)\n *\n * 仅保留不依赖 node:fs / node:path 的函数:\n * - checkCompatibility:版本兼容性检查\n * - generateManifestTemplate:生成 manifest 模板对象\n *\n * 依赖文件系统的函数(readManifest / writeManifest / deriveManifestFromPackageJson /\n * validateManifestFile)已迁移至 ./manifest-node.js,仅供 Node 环境(CLI)使用。\n *\n * 拆分原因:原 manifest.js 顶层 `import 'node:fs'` 会被 Vite 静态打包并 externalize,\n * 导致浏览器运行时抛出 \"Module node:fs has been externalized for browser\" 错误。\n * 浏览器侧代码(themes / datasources / ui / vue)通过 @nbreak/sdk 主入口\n * 引入 define* 工厂时,不应触发 node:fs 加载。\n */\n\nimport {\n createManifest,\n isVersionCompatible,\n} from '@nbreak/shared';\n\n/**\n * 检查扩展与宿主版本兼容性\n * @param {Object} manifest\n * @param {string} hostVersion\n * @returns {{compatible: boolean, reason: string}}\n */\nexport function checkCompatibility(manifest, hostVersion) {\n if (!manifest.datascreenVersion) {\n return { compatible: true, reason: '未声明版本要求' };\n }\n if (!hostVersion) {\n return { compatible: true, reason: '宿主版本未知,跳过检查' };\n }\n const compatible = isVersionCompatible(manifest.datascreenVersion, hostVersion);\n return {\n compatible,\n reason: compatible\n ? '版本兼容'\n : `扩展要求 ${manifest.datascreenVersion},当前 ${hostVersion}`,\n };\n}\n\n/**\n * 生成 manifest 模板\n * @param {string} type - 扩展类型\n * @param {string} name - 扩展名称\n * @param {Object} [extra]\n * @returns {Object}\n */\nexport function generateManifestTemplate(type, name, extra = {}) {\n return createManifest({\n name: name,\n type: type,\n ...extra,\n });\n}\n","/**\n * @nbreak/sdk - 入口\n *\n * 扩展开发 SDK,提供:\n * - define* 工厂函数(6 类扩展定义)\n * - Manifest 工具\n * - 注册辅助函数\n */\n\n// 扩展定义 API\nexport {\n defineComponentExtension,\n defineThemeExtension,\n defineDataSourceExtension,\n defineTemplateExtension,\n defineActionExtension,\n definePropertyFieldExtension,\n defineExtension,\n} from './define.js';\n\n// Manifest 工具(浏览器安全子集)\n// 注意:依赖 node:fs 的函数(readManifest / writeManifest /\n// deriveManifestFromPackageJson / validateManifestFile)已迁移到 ./manifest-node.js,\n// 不再从主入口导出,以避免 Vite 浏览器构建时静态引入 node:fs。\n// Node/CLI 环境请直接从 './manifest-node.js' 或 '@nbreak/sdk/manifest-node' 导入。\nexport {\n checkCompatibility,\n generateManifestTemplate,\n} from './manifest.js';\n\n// 共享类型与常量\nexport {\n EXTENSION_TYPES,\n PROPERTY_FIELD_TYPES,\n COMPONENT_CATEGORIES,\n definePropertyField,\n definePropertyGroup,\n groupFields,\n resolveDefaults,\n validateField,\n} from '@nbreak/shared';\n\n// 注册表(re-export 便于直接使用)\nexport { extensionRegistry } from '@nbreak/core';\n\n// 版本信息\nexport const VERSION = '0.1.0';\nexport const PACKAGE_NAME = '@nbreak/sdk';\n\n/**\n * 批量注册扩展(便捷 API)\n * @param {Array} extensions\n * @returns {Promise<Array<boolean>>}\n */\nexport async function registerExtensions(extensions) {\n const { extensionRegistry } = await import('@nbreak/core');\n return extensionRegistry.registerAll(extensions);\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nbreak/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DataScreen 扩展开发 SDK:定义 API、CLI 工具链、manifest 校验",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/cjs/index.cjs",
|
|
7
|
+
"module": "./dist/esm/index.js",
|
|
8
|
+
"bin": {
|
|
9
|
+
"datascreen": "./bin/datascreen.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/esm/index.js",
|
|
14
|
+
"require": "./dist/cjs/index.cjs"
|
|
15
|
+
},
|
|
16
|
+
"./cli": {
|
|
17
|
+
"import": "./dist/esm/cli/index.js",
|
|
18
|
+
"require": "./dist/cjs/cli/index.cjs"
|
|
19
|
+
},
|
|
20
|
+
"./manifest-node": {
|
|
21
|
+
"import": "./dist/esm/manifest-node.js",
|
|
22
|
+
"require": "./dist/cjs/manifest-node.cjs"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"bin",
|
|
28
|
+
"README.md"
|
|
29
|
+
],
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@nbreak/core": "0.1.0",
|
|
32
|
+
"@nbreak/shared": "0.1.0"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "rm -rf dist && BUILD_FORMAT=es vite build && BUILD_FORMAT=cjs vite build",
|
|
40
|
+
"dev": "vite build --watch"
|
|
41
|
+
}
|
|
42
|
+
}
|