@chatbi-v/cli 2.0.2 → 2.0.4

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.
Files changed (41) hide show
  1. package/bin/chatbi-cli.js +1 -2
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +2464 -188
  4. package/package.json +6 -3
  5. package/templates/app/package.json.hbs +5 -2
  6. package/templates/plugin/package.json.hbs +5 -5
  7. package/templates/plugin/tsconfig.json.hbs +1 -1
  8. package/dist/bench-ACSHVGHE.mjs +0 -77
  9. package/dist/build-UB4D3WNI.mjs +0 -11
  10. package/dist/chunk-4OD6C56P.mjs +0 -89
  11. package/dist/chunk-7A54IJI5.mjs +0 -6368
  12. package/dist/chunk-LJFX6MNO.mjs +0 -255
  13. package/dist/chunk-SBGVKO4C.mjs +0 -2255
  14. package/dist/chunk-TX5M36S5.mjs +0 -55
  15. package/dist/chunk-V7IEPMC4.mjs +0 -52
  16. package/dist/chunk-WCPZB47I.mjs +0 -262
  17. package/dist/chunk-WIVHOK75.mjs +0 -5292
  18. package/dist/chunk-Y24V4GQG.mjs +0 -9577
  19. package/dist/commands/add.js +0 -182
  20. package/dist/commands/bench.js +0 -100
  21. package/dist/commands/build.js +0 -290
  22. package/dist/commands/dev.js +0 -8
  23. package/dist/commands/discover.js +0 -25
  24. package/dist/commands/doctor.js +0 -231
  25. package/dist/commands/fetch.js +0 -41
  26. package/dist/commands/gl.js +0 -151
  27. package/dist/commands/init.js +0 -253
  28. package/dist/commands/install.js +0 -85
  29. package/dist/commands/ls.js +0 -46
  30. package/dist/commands/sync.js +0 -78
  31. package/dist/commands/use.js +0 -31
  32. package/dist/config.js +0 -70
  33. package/dist/corekit.js +0 -370
  34. package/dist/execa-METROS6Z.mjs +0 -17
  35. package/dist/fetch-7X2UFWIV.mjs +0 -10
  36. package/dist/index.cjs +0 -27278
  37. package/dist/index.mjs +0 -2769
  38. package/dist/init-QFRFYEA5.mjs +0 -12
  39. package/dist/sandbox.js +0 -522
  40. package/dist/sync-7HPKGVFY.mjs +0 -11
  41. package/dist/utils.js +0 -99
@@ -1,182 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.add = add;
7
- const fs_extra_1 = __importDefault(require("fs-extra"));
8
- const path_1 = __importDefault(require("path"));
9
- const picocolors_1 = __importDefault(require("picocolors"));
10
- const prompts_1 = __importDefault(require("prompts"));
11
- const handlebars_1 = __importDefault(require("handlebars"));
12
- const utils_1 = require("../utils");
13
- const config_1 = require("../config");
14
- // ... (shims remain the same)
15
- const _require = require;
16
- const _filename = __filename;
17
- const _dirname = __dirname;
18
- async function add(options) {
19
- let { name, type, displayName, description } = options;
20
- // 1. 验证是否在项目根目录下
21
- const cwd = process.cwd();
22
- const pkgPath = path_1.default.join(cwd, 'package.json');
23
- if (!fs_extra_1.default.existsSync(pkgPath)) {
24
- utils_1.logger.error('未找到 package.json。请在 ChatBI-V 项目根目录下运行此命令。');
25
- return;
26
- }
27
- const pkg = await fs_extra_1.default.readJson(pkgPath);
28
- const isMonorepo = pkg.workspaces && (pkg.workspaces.includes('plugins/*') || pkg.workspaces.packages?.includes('plugins/*'));
29
- if (!isMonorepo) {
30
- utils_1.logger.error('当前不是 Monorepo 项目,无法添加插件 (请在包含 plugins/ 工作空间的项目中运行)');
31
- process.exit(1);
32
- }
33
- // 2. 交互式获取信息
34
- const response = await (0, prompts_1.default)([
35
- {
36
- type: name ? null : 'text',
37
- name: 'pluginName',
38
- message: '请输入插件名称 (ID, 建议小写和中划线):',
39
- initial: 'my-custom-plugin',
40
- validate: (value) => /^[a-z0-9-]+$/.test(value) || '名称只能包含小写字母、数字和中划线'
41
- },
42
- {
43
- type: displayName ? null : 'text',
44
- name: 'pluginDisplayName',
45
- message: '请输入插件显示名称 (中文):',
46
- initial: (prev) => prev || name,
47
- },
48
- {
49
- type: description ? null : 'text',
50
- name: 'pluginDescription',
51
- message: '请输入插件描述:',
52
- initial: '一个简单的 ChatBI-V 插件',
53
- },
54
- {
55
- type: type ? null : 'select',
56
- name: 'pluginType',
57
- message: '请选择插件类型:',
58
- choices: [
59
- { title: 'Business (业务插件)', value: 'business', description: '包含 UI 界面和业务逻辑' },
60
- { title: 'System (系统插件)', value: 'system', description: '侧重于底层能力和系统扩展' }
61
- ],
62
- initial: 0
63
- }
64
- ], {
65
- onCancel: () => {
66
- utils_1.logger.warn('已取消添加插件');
67
- process.exit(0);
68
- }
69
- });
70
- name = name || response.pluginName;
71
- type = type || response.pluginType;
72
- displayName = displayName || response.pluginDisplayName || name;
73
- description = description || response.pluginDescription || '';
74
- // 处理名称,去掉冗余的 -plugin 后缀并加上 plugin- 前缀
75
- let cleanName = name;
76
- if (cleanName.endsWith('-plugin')) {
77
- cleanName = cleanName.replace(/-plugin$/, '');
78
- }
79
- const folderName = cleanName.startsWith('plugin-') ? cleanName : `plugin-${cleanName}`;
80
- const pluginDir = path_1.default.resolve(cwd, 'plugins', folderName);
81
- if (fs_extra_1.default.existsSync(pluginDir)) {
82
- utils_1.logger.error(`插件目录 ${folderName} 已存在。`);
83
- return;
84
- }
85
- const spinner = (0, utils_1.createSpinner)(`正在添加新插件: ${picocolors_1.default.bold(name)}...`).start();
86
- // 3. 寻找模板目录
87
- const myCliRoot = await (0, utils_1.getCliRoot)();
88
- const templateDir = path_1.default.join(myCliRoot, 'templates/plugin');
89
- if (!fs_extra_1.default.existsSync(templateDir)) {
90
- spinner.fail('找不到插件模板');
91
- throw new Error(`找不到插件模板: ${templateDir}`);
92
- }
93
- const targetDir = pluginDir;
94
- // Load Config
95
- spinner.text = '正在加载配置...';
96
- const config = await config_1.ConfigManager.loadConfig(cwd);
97
- const coreSource = config.coreSource || 'local';
98
- let corePath = 'file:../../.chatbi/core'; // Default local path relative to plugins/xxx
99
- if (coreSource === 'npm') {
100
- if (!config.coreVersion) {
101
- const cliPkg = await fs_extra_1.default.readJson(path_1.default.join(myCliRoot, 'package.json'));
102
- corePath = cliPkg.version;
103
- }
104
- else {
105
- corePath = config.coreVersion;
106
- }
107
- }
108
- // 4. 定义渲染数据
109
- const data = {
110
- // 兼容旧模板
111
- name: `@chatbi-v/${folderName}`,
112
- pluginId: cleanName,
113
- pluginType: type,
114
- className: cleanName.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(''),
115
- isBusiness: type === 'business',
116
- corePath,
117
- // 新模板变量
118
- pluginName: cleanName,
119
- pluginPackageName: `@chatbi-v/${folderName}`,
120
- pluginVersion: '0.1.0',
121
- pluginDisplayName: displayName,
122
- pluginDescription: description,
123
- pluginClassName: cleanName.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(''),
124
- pluginPath: folderName,
125
- pluginFolderName: folderName,
126
- // Fix: 注入 tsconfigPath,确保 tsconfig.json 能正确 extend
127
- tsconfigPath: '../../.chatbi/tsconfig.json'
128
- };
129
- // 5. 渲染函数
130
- const renderFile = async (src, dest) => {
131
- const content = await fs_extra_1.default.readFile(src, 'utf-8');
132
- let result = content;
133
- // 启发式判断:包含 {{ 即视为 Handlebars 模板
134
- const hasHandlebarsVars = content.includes('{{');
135
- if (hasHandlebarsVars) {
136
- try {
137
- // 针对可能包含 React {{ }} 的文件,做一个简单的预处理
138
- // 只有当 {{ 后面紧跟着 Handlebars 关键字或变量名时,才保留;否则转义
139
- const safeContent = content.replace(/\{\{(?!\s*([#/]?(?:if|else|each|with|unless|name|version|projectName|projectTitle|projectVersion|cliVersion|tsconfigPath|theme|isNebula|isGlass|isBusiness|isApp|isShell|pluginName|pluginPackageName|pluginVersion|pluginDisplayName|pluginDescription|pluginClassName|pluginPath|pluginFolderName|pluginType|pluginId|className))\b)/g, '\\{{');
140
- const templateFn = handlebars_1.default.compile(safeContent);
141
- result = templateFn(data);
142
- }
143
- catch (e) {
144
- // 编译失败则降级为简单替换
145
- result = content;
146
- for (const [key, val] of Object.entries(data)) {
147
- const regex = new RegExp(`\\{\\{\\s*${key}\\s*\\}\\}`, 'g');
148
- result = result.replace(regex, String(val));
149
- }
150
- }
151
- }
152
- await fs_extra_1.default.outputFile(dest.replace('.hbs', ''), result);
153
- };
154
- // 6. 递归处理插件模板
155
- const processTemplates = async (currentSrc, currentDest) => {
156
- const files = await fs_extra_1.default.readdir(currentSrc);
157
- for (const file of files) {
158
- const srcPath = path_1.default.join(currentSrc, file);
159
- const destPath = path_1.default.join(currentDest, file);
160
- const stats = await fs_extra_1.default.stat(srcPath);
161
- if (stats.isDirectory()) {
162
- await fs_extra_1.default.ensureDir(destPath);
163
- await processTemplates(srcPath, destPath);
164
- }
165
- else if (file.endsWith('.hbs')) {
166
- await renderFile(srcPath, destPath);
167
- }
168
- else {
169
- await fs_extra_1.default.copy(srcPath, destPath);
170
- }
171
- }
172
- };
173
- spinner.text = '正在生成插件文件...';
174
- await processTemplates(templateDir, targetDir);
175
- spinner.succeed(`插件 ${picocolors_1.default.bold(name)} 添加成功!`);
176
- (0, utils_1.printBox)(`${picocolors_1.default.green(picocolors_1.default.bold('✨ 插件创建成功!'))}\n\n` +
177
- `${picocolors_1.default.white('项目路径: ')} ${picocolors_1.default.cyan(`plugins/${folderName}`)}\n` +
178
- `${picocolors_1.default.white('插件 ID: ')} ${picocolors_1.default.cyan(cleanName)}\n` +
179
- `${picocolors_1.default.white('插件类型: ')} ${picocolors_1.default.cyan(type)}\n\n` +
180
- `${picocolors_1.default.white('接下来你可以:')}\n` +
181
- `${picocolors_1.default.cyan(' pnpm dev')} 启动开发环境查看效果`, 'Plugin Created');
182
- }
@@ -1,100 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.bench = bench;
40
- const picocolors_1 = __importDefault(require("picocolors"));
41
- const fs_extra_1 = __importDefault(require("fs-extra"));
42
- const path_1 = __importDefault(require("path"));
43
- const os_1 = __importDefault(require("os"));
44
- const utils_1 = require("../utils");
45
- async function bench() {
46
- utils_1.logger.info('正在启动 CLI 性能基准测试...');
47
- const results = [];
48
- const tmpDir = path_1.default.join(os_1.default.tmpdir(), `chatbi-bench-${Date.now()}`);
49
- await fs_extra_1.default.ensureDir(tmpDir);
50
- try {
51
- // 1. Init Project
52
- const initSpinner = (0, utils_1.createSpinner)('正在测试: 初始化插件项目 (init)...').start();
53
- const startInit = Date.now();
54
- const { init } = await Promise.resolve().then(() => __importStar(require('./init')));
55
- const testProjDir = path_1.default.join(tmpDir, 'bench-proj');
56
- await init({ name: 'bench-proj', projectType: 'plugin', cwd: tmpDir });
57
- const endInit = Date.now();
58
- const initTime = (endInit - startInit) / 1000;
59
- initSpinner.succeed(`初始化完成: ${picocolors_1.default.cyan(initTime.toFixed(2) + 's')}`);
60
- results.push({
61
- scene: '初始化插件项目 (init)',
62
- target: '≤ 5.0 s',
63
- actual: `${initTime.toFixed(2)} s`
64
- });
65
- // 2. Sandbox Setup
66
- const syncSpinner = (0, utils_1.createSpinner)('正在测试: 沙箱环境同步 (sync)...').start();
67
- const startSync = Date.now();
68
- const { sync } = await Promise.resolve().then(() => __importStar(require('./sync')));
69
- await sync({ cwd: testProjDir });
70
- const endSync = Date.now();
71
- const syncTime = (endSync - startSync) / 1000;
72
- syncSpinner.succeed(`同步完成: ${picocolors_1.default.cyan(syncTime.toFixed(2) + 's')}`);
73
- results.push({
74
- scene: '沙箱环境同步 (sync)',
75
- target: '≤ 2.0 s',
76
- actual: `${syncTime.toFixed(2)} s`
77
- });
78
- // 3. Build Project
79
- const buildSpinner = (0, utils_1.createSpinner)('正在测试: 插件项目构建 (build)...').start();
80
- const startBuild = Date.now();
81
- const { build } = await Promise.resolve().then(() => __importStar(require('./build')));
82
- const originalCwd = process.cwd();
83
- process.chdir(testProjDir);
84
- await build({ watch: false });
85
- process.chdir(originalCwd);
86
- const endBuild = Date.now();
87
- const buildTime = (endBuild - startBuild) / 1000;
88
- buildSpinner.succeed(`构建完成: ${picocolors_1.default.cyan(buildTime.toFixed(2) + 's')}`);
89
- results.push({
90
- scene: '插件项目构建 (build)',
91
- target: '≤ 10.0 s',
92
- actual: `${buildTime.toFixed(2)} s`
93
- });
94
- (0, utils_1.printBox)(`${picocolors_1.default.green(picocolors_1.default.bold('✨ 基准测试完成!'))}\n\n` +
95
- results.map(r => `${picocolors_1.default.white(r.scene.padEnd(20))}: ${picocolors_1.default.cyan(r.actual)} (目标 ${r.target})`).join('\n'), 'Benchmark Results');
96
- }
97
- finally {
98
- await fs_extra_1.default.remove(tmpDir);
99
- }
100
- }
@@ -1,290 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.build = build;
40
- const execa_1 = require("execa");
41
- const fs_extra_1 = __importDefault(require("fs-extra"));
42
- const path_1 = __importDefault(require("path"));
43
- const picocolors_1 = __importDefault(require("picocolors"));
44
- const tsup_1 = require("tsup");
45
- const sandbox_1 = require("../sandbox");
46
- const corekit_1 = require("../corekit");
47
- const utils_1 = require("../utils");
48
- async function build(options) {
49
- const cwd = process.cwd();
50
- const pkgPath = path_1.default.join(cwd, 'package.json');
51
- if (!fs_extra_1.default.existsSync(pkgPath)) {
52
- utils_1.logger.error(`在 ${cwd} 中未找到 package.json`);
53
- return;
54
- }
55
- const pkg = await fs_extra_1.default.readJson(pkgPath);
56
- const version = await corekit_1.CoreKit.resolveVersion(cwd);
57
- utils_1.logger.info(`正在构建项目: ${picocolors_1.default.bold(pkg.name || 'unnamed')} (内核版本: ${version})\n`);
58
- const spinner = (0, utils_1.createSpinner)('正在准备构建环境...').start();
59
- // 1. 自动关联/初始化沙箱内核
60
- spinner.text = '正在同步沙箱内核...';
61
- await sandbox_1.Sandbox.prepare(version);
62
- // 如果是 Monorepo,我们需要为所有子包也准备好虚拟上下文
63
- if (pkg.workspaces || fs_extra_1.default.existsSync(path_1.default.join(cwd, 'pnpm-workspace.yaml'))) {
64
- spinner.text = '检测到 Monorepo,正在同步子包上下文...';
65
- await sandbox_1.Sandbox.injectContext(cwd, version);
66
- const subDirs = ['apps', 'plugins'];
67
- for (const dir of subDirs) {
68
- const dirPath = path_1.default.join(cwd, dir);
69
- if (fs_extra_1.default.existsSync(dirPath)) {
70
- const entries = await fs_extra_1.default.readdir(dirPath, { withFileTypes: true });
71
- for (const entry of entries) {
72
- if (entry.isDirectory()) {
73
- const subPkgPath = path_1.default.join(dirPath, entry.name);
74
- if (fs_extra_1.default.existsSync(path_1.default.join(subPkgPath, 'package.json'))) {
75
- await sandbox_1.Sandbox.injectContext(subPkgPath, version);
76
- }
77
- }
78
- }
79
- }
80
- }
81
- }
82
- else {
83
- await sandbox_1.Sandbox.injectContext(cwd, version);
84
- }
85
- spinner.succeed('构建环境就绪');
86
- // 2. 运行自定义构建命令 (防止递归)
87
- if (pkg.scripts && pkg.scripts.build && !process.env.CHATBI_CLI_INTERNAL) {
88
- const buildScript = pkg.scripts.build;
89
- if (!buildScript.includes('chatbi-cli build') && !buildScript.includes('chatbi build')) {
90
- utils_1.logger.info(`检测到自定义 build 脚本,正在执行: ${picocolors_1.default.cyan('npm run build')}`);
91
- const args = ['run', 'build'];
92
- if (options.watch) {
93
- args.push('--', '--watch');
94
- }
95
- await (0, execa_1.execa)('npm', args, {
96
- stdio: 'inherit',
97
- env: { ...process.env, CHATBI_CLI_INTERNAL: 'true' }
98
- });
99
- return;
100
- }
101
- }
102
- // 3. 模式识别
103
- const mode = await corekit_1.CoreKit.detectMode(cwd);
104
- if (mode === 'app') {
105
- // === App 模式构建 (Vite) ===
106
- utils_1.logger.info('正在构建应用 (Vite)...');
107
- const { build: viteBuild } = await Promise.resolve().then(() => __importStar(require('vite')));
108
- const coreAlias = sandbox_1.Sandbox.getCoreAlias(version);
109
- await viteBuild({
110
- root: cwd,
111
- configFile: fs_extra_1.default.existsSync(path_1.default.join(cwd, 'vite.config.ts')) ? undefined : false,
112
- resolve: {
113
- alias: {
114
- ...coreAlias
115
- }
116
- },
117
- build: {
118
- watch: options.watch ? {} : null,
119
- outDir: 'dist',
120
- emptyOutDir: true
121
- },
122
- server: {
123
- fs: {
124
- allow: [
125
- sandbox_1.Sandbox.getRoot(),
126
- cwd
127
- ]
128
- }
129
- }
130
- });
131
- if (!options.watch) {
132
- (0, utils_1.printBox)(picocolors_1.default.green(picocolors_1.default.bold('✨ 应用构建成功!')) + '\n\n' +
133
- picocolors_1.default.white('产物目录: ') + picocolors_1.default.cyan('dist'), 'Build Success');
134
- }
135
- return;
136
- }
137
- // === Plugin/Lib 模式构建 (tsup) ===
138
- // 1. Determine entry
139
- let entry = ['src/index.ts'];
140
- if (fs_extra_1.default.existsSync(path_1.default.join(cwd, 'src/index.tsx'))) {
141
- entry = ['src/index.tsx'];
142
- }
143
- else if (!fs_extra_1.default.existsSync(path_1.default.join(cwd, 'src/index.ts'))) {
144
- utils_1.logger.error('未找到入口文件。期望 src/index.ts 或 src/index.tsx');
145
- return;
146
- }
147
- const isPlugin = mode === 'plugin';
148
- // 1.5 Clean output folder manually
149
- if (!options.watch) {
150
- await fs_extra_1.default.remove(path_1.default.join(cwd, 'dist'));
151
- const tsbuildinfo = path_1.default.join(cwd, 'tsconfig.tsbuildinfo');
152
- if (fs_extra_1.default.existsSync(tsbuildinfo)) {
153
- await fs_extra_1.default.remove(tsbuildinfo);
154
- }
155
- }
156
- const external = [
157
- 'react',
158
- 'react-dom',
159
- 'react/jsx-runtime',
160
- 'react-is',
161
- 'antd',
162
- '@ant-design/icons',
163
- '@ant-design/x',
164
- ...Object.keys(pkg.dependencies || {}),
165
- ...Object.keys(pkg.peerDependencies || {})
166
- ];
167
- if (isPlugin) {
168
- const coreDeps = sandbox_1.Sandbox.CORE_PACKAGES;
169
- coreDeps.forEach(dep => {
170
- if (!external.includes(dep)) {
171
- external.push(dep);
172
- }
173
- });
174
- }
175
- const commonConfig = {
176
- entry,
177
- dts: false,
178
- clean: false,
179
- sourcemap: false,
180
- target: 'esnext',
181
- platform: (isPlugin ? 'browser' : 'node'),
182
- external,
183
- watch: options.watch,
184
- silent: true,
185
- esbuildOptions(options) {
186
- options.logOverride = {
187
- 'empty-import-meta': 'silent'
188
- };
189
- options.external = options.external || [];
190
- const forceExternal = [
191
- 'react',
192
- 'react-dom',
193
- 'antd',
194
- '@ant-design/icons',
195
- '@ant-design/x',
196
- ...sandbox_1.Sandbox.CORE_PACKAGES
197
- ];
198
- forceExternal.forEach(dep => {
199
- if (!options.external.includes(dep)) {
200
- options.external.push(dep);
201
- }
202
- });
203
- }
204
- };
205
- const buildSpinner = (0, utils_1.createSpinner)('正在编译源码...').start();
206
- if (isPlugin) {
207
- buildSpinner.text = '正在构建 ESM 格式...';
208
- await (0, tsup_1.build)({
209
- ...commonConfig,
210
- format: ['esm'],
211
- outExtension: () => ({ js: '.mjs' }),
212
- });
213
- buildSpinner.text = '正在构建 IIFE 格式 (Plugin)...';
214
- await (0, tsup_1.build)({
215
- ...commonConfig,
216
- format: ['iife'],
217
- globalName: pkg.name.replace(/[^a-zA-Z0-9]/g, '_'),
218
- outExtension: () => ({ js: '.plugin.js' }),
219
- platform: 'browser',
220
- define: {
221
- 'import.meta.env': 'process.env',
222
- },
223
- esbuildOptions(options) {
224
- options.logOverride = {
225
- 'empty-import-meta': 'silent'
226
- };
227
- options.external = options.external || [];
228
- const forceExternal = [
229
- 'react',
230
- 'react-dom',
231
- 'antd',
232
- '@ant-design/icons',
233
- '@ant-design/x',
234
- ...sandbox_1.Sandbox.CORE_PACKAGES
235
- ];
236
- forceExternal.forEach(dep => {
237
- if (!options.external.includes(dep)) {
238
- options.external.push(dep);
239
- }
240
- });
241
- }
242
- });
243
- }
244
- else {
245
- buildSpinner.text = '正在编译源码...';
246
- await (0, tsup_1.build)({
247
- ...commonConfig,
248
- format: ['cjs', 'esm'],
249
- outExtension({ format }) {
250
- return { js: format === 'esm' ? '.mjs' : '.cjs' };
251
- }
252
- });
253
- }
254
- buildSpinner.succeed('源码编译完成');
255
- // 3. DTS Build with tsc
256
- if (!options.watch) {
257
- const dtsSpinner = (0, utils_1.createSpinner)('正在生成类型定义...').start();
258
- try {
259
- const localTsc = path_1.default.join(cwd, 'node_modules/.bin/tsc');
260
- const sandboxTsc = path_1.default.join(sandbox_1.Sandbox.getVersionPath(version), 'node_modules/.bin/tsc');
261
- let tscBin = 'tsc';
262
- if (fs_extra_1.default.existsSync(localTsc)) {
263
- tscBin = localTsc;
264
- }
265
- else if (fs_extra_1.default.existsSync(sandboxTsc)) {
266
- tscBin = sandboxTsc;
267
- }
268
- else {
269
- if (fs_extra_1.default.existsSync(path_1.default.join(cwd, 'pnpm-lock.yaml'))) {
270
- await (0, execa_1.execa)('pnpm', ['exec', 'tsc', '--build', 'tsconfig.json']);
271
- dtsSpinner.succeed('类型定义生成完成');
272
- }
273
- else {
274
- await (0, execa_1.execa)('npx', ['-p', 'typescript', 'tsc', '--build', 'tsconfig.json']);
275
- dtsSpinner.succeed('类型定义生成完成');
276
- }
277
- }
278
- if (tscBin !== 'tsc') {
279
- await (0, execa_1.execa)(tscBin, ['--build', 'tsconfig.json']);
280
- dtsSpinner.succeed('类型定义生成完成');
281
- }
282
- }
283
- catch (e) {
284
- dtsSpinner.warn('类型生成失败,请检查项目中的 tsconfig.json 配置');
285
- }
286
- (0, utils_1.printBox)(picocolors_1.default.green(picocolors_1.default.bold('✨ 构建完成!')) + '\n\n' +
287
- picocolors_1.default.white('产物目录: ') + picocolors_1.default.cyan('dist') + '\n' +
288
- picocolors_1.default.white('构建模式: ') + picocolors_1.default.cyan(isPlugin ? 'Plugin' : 'Library'), 'Build Success');
289
- }
290
- }
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dev = dev;
4
- const corekit_1 = require("../corekit");
5
- async function dev(options = {}) {
6
- const cwd = process.cwd();
7
- await corekit_1.CoreKit.startDev(cwd, options);
8
- }
@@ -1,25 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.discover = discover;
7
- const picocolors_1 = __importDefault(require("picocolors"));
8
- const corekit_1 = require("../corekit");
9
- const utils_1 = require("../utils");
10
- async function discover() {
11
- const cwd = process.cwd();
12
- const spinner = (0, utils_1.createSpinner)('正在扫描项目中的插件...').start();
13
- const plugins = await corekit_1.CoreKit.discoverPlugins(cwd);
14
- if (plugins.length === 0) {
15
- spinner.warn('未发现任何插件');
16
- utils_1.logger.info(picocolors_1.default.gray('请确保插件位于 plugins/ 目录下,且包含 package.json。'));
17
- }
18
- else {
19
- spinner.succeed(`发现了 ${picocolors_1.default.cyan(plugins.length)} 个插件`);
20
- const pluginList = plugins
21
- .map(p => `- ${picocolors_1.default.bold(p.name)} ${picocolors_1.default.gray(`(${p.id})`)}\n ${picocolors_1.default.gray(p.path)}`)
22
- .join('\n\n');
23
- (0, utils_1.printBox)(`${picocolors_1.default.green(picocolors_1.default.bold('✨ 插件扫描结果'))}\n\n${pluginList}`, 'Plugin Discovery');
24
- }
25
- }