@mindbase/cli 1.0.5 → 1.0.8
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/package.json +5 -7
- package/src/bin/mindbase.ts +39 -0
- package/src/commands/init/backend.ts +34 -0
- package/src/commands/init/frontend.ts +34 -0
- package/src/commands/init/index.ts +50 -0
- package/src/commands/sdk-docs.ts +138 -0
- package/src/index.ts +33 -0
- package/src/utils/BackendInitializer.ts +377 -0
- package/src/utils/FrontendInitializer.ts +370 -0
- package/src/utils/Logger.ts +219 -0
- package/src/utils/prompts.ts +140 -0
- package/tsconfig.json +15 -0
- package/dist/bin/mindbase.d.ts +0 -1
- package/dist/bin/mindbase.js +0 -40
- package/dist/bin/mindbase.js.map +0 -1
- package/dist/chunk-V3ATOUGD.js +0 -938
- package/dist/chunk-V3ATOUGD.js.map +0 -1
- package/dist/index.d.ts +0 -139
- package/dist/index.js +0 -49
- package/dist/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mindbase/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
|
-
"mindbase": "./
|
|
6
|
+
"mindbase": "./src/bin/mindbase.ts"
|
|
7
7
|
},
|
|
8
8
|
"files": [
|
|
9
|
+
"src",
|
|
9
10
|
"assets",
|
|
10
|
-
"
|
|
11
|
+
"tsconfig.json"
|
|
11
12
|
],
|
|
12
13
|
"engines": {
|
|
13
14
|
"node": ">=20.0.0"
|
|
@@ -19,13 +20,10 @@
|
|
|
19
20
|
},
|
|
20
21
|
"devDependencies": {
|
|
21
22
|
"@types/prompts": "^2.4.9",
|
|
22
|
-
"tsup": "^8.0.0",
|
|
23
23
|
"typescript": "^5.1.3"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
|
-
"
|
|
27
|
-
"build:watch": "tsup --watch",
|
|
28
|
-
"prepublishOnly": "npm run build"
|
|
26
|
+
"prepare": "tsc --noEmit"
|
|
29
27
|
},
|
|
30
28
|
"publishConfig": {
|
|
31
29
|
"access": "public"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { init } from "../commands/init";
|
|
3
|
+
|
|
4
|
+
const args = process.argv.slice(2);
|
|
5
|
+
const command = args[0];
|
|
6
|
+
const type = args[1];
|
|
7
|
+
|
|
8
|
+
async function main() {
|
|
9
|
+
switch (command) {
|
|
10
|
+
case "init":
|
|
11
|
+
await init(type);
|
|
12
|
+
break;
|
|
13
|
+
default:
|
|
14
|
+
showHelp();
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function showHelp() {
|
|
20
|
+
console.log(`
|
|
21
|
+
用法: mindbase <command> [type]
|
|
22
|
+
|
|
23
|
+
命令:
|
|
24
|
+
init [type] 初始化新项目
|
|
25
|
+
backend 后端项目
|
|
26
|
+
frontend 前端项目
|
|
27
|
+
admin 管理后台前后端
|
|
28
|
+
|
|
29
|
+
示例:
|
|
30
|
+
mindbase init backend # 交互式选择后端模块
|
|
31
|
+
mindbase init frontend # 交互式选择前端应用形态
|
|
32
|
+
mindbase init admin # 一键初始化完整管理后台
|
|
33
|
+
`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
main().catch((err) => {
|
|
37
|
+
console.error("❌ 执行失败:", err);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
collectBackendConfig,
|
|
3
|
+
setupBackendPackageJson,
|
|
4
|
+
setupAppConfig,
|
|
5
|
+
setupDrizzleConfig,
|
|
6
|
+
setupTsConfig,
|
|
7
|
+
setupAppEntry,
|
|
8
|
+
copyAssets,
|
|
9
|
+
setupPrepareScript,
|
|
10
|
+
} from "../../utils/BackendInitializer";
|
|
11
|
+
import logger from "../../utils/Logger";
|
|
12
|
+
|
|
13
|
+
export async function initBackend() {
|
|
14
|
+
const cwd = process.cwd();
|
|
15
|
+
logger.info(`\n🚀 正在初始化 MindBase 后端项目: ${cwd}\n`);
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
// 1. 交互式收集配置
|
|
19
|
+
const config = await collectBackendConfig(cwd);
|
|
20
|
+
|
|
21
|
+
// 2. 执行各个初始化步骤
|
|
22
|
+
setupBackendPackageJson(cwd, config);
|
|
23
|
+
setupAppConfig(cwd, config);
|
|
24
|
+
setupDrizzleConfig(cwd, config);
|
|
25
|
+
setupTsConfig(cwd);
|
|
26
|
+
setupAppEntry(cwd, config);
|
|
27
|
+
copyAssets(cwd);
|
|
28
|
+
setupPrepareScript(cwd);
|
|
29
|
+
|
|
30
|
+
logger.info("\n✨ 后端项目初始化成功!建议运行: npm install\n");
|
|
31
|
+
} catch (err) {
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
collectFrontendConfig,
|
|
3
|
+
setupFrontendPackageJson,
|
|
4
|
+
setupViteConfig,
|
|
5
|
+
setupFrontendTsConfig,
|
|
6
|
+
setupIndexHtml,
|
|
7
|
+
setupAppFiles,
|
|
8
|
+
setupPublicDir,
|
|
9
|
+
copyAdminAssets,
|
|
10
|
+
} from "../../utils/FrontendInitializer";
|
|
11
|
+
import logger from "../../utils/Logger";
|
|
12
|
+
|
|
13
|
+
export async function initFrontend() {
|
|
14
|
+
const cwd = process.cwd();
|
|
15
|
+
logger.info(`\n🚀 正在初始化 MindBase 前端项目: ${cwd}\n`);
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
// 1. 交互式收集配置
|
|
19
|
+
const config = await collectFrontendConfig(cwd);
|
|
20
|
+
|
|
21
|
+
// 2. 执行各个初始化步骤
|
|
22
|
+
setupFrontendPackageJson(cwd, config);
|
|
23
|
+
setupViteConfig(cwd, config);
|
|
24
|
+
setupFrontendTsConfig(cwd);
|
|
25
|
+
setupIndexHtml(cwd, config);
|
|
26
|
+
setupAppFiles(cwd, config);
|
|
27
|
+
setupPublicDir(cwd);
|
|
28
|
+
copyAdminAssets(cwd, config);
|
|
29
|
+
|
|
30
|
+
logger.info("\n✨ 前端项目初始化成功!建议运行: npm install\n");
|
|
31
|
+
} catch (err) {
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { initBackend } from "./backend";
|
|
2
|
+
import { initFrontend } from "./frontend";
|
|
3
|
+
|
|
4
|
+
export async function init(type?: string) {
|
|
5
|
+
switch (type) {
|
|
6
|
+
case "backend":
|
|
7
|
+
await initBackend();
|
|
8
|
+
break;
|
|
9
|
+
case "frontend":
|
|
10
|
+
await initFrontend();
|
|
11
|
+
break;
|
|
12
|
+
case "admin":
|
|
13
|
+
await initAdmin();
|
|
14
|
+
break;
|
|
15
|
+
default:
|
|
16
|
+
console.log(`
|
|
17
|
+
用法: mindbase init <type>
|
|
18
|
+
|
|
19
|
+
类型:
|
|
20
|
+
backend 初始化后端项目
|
|
21
|
+
frontend 初始化前端项目
|
|
22
|
+
admin 快捷:初始化完整管理后台(前后端一体)
|
|
23
|
+
`);
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 快捷方式:初始化完整管理后台
|
|
30
|
+
* 先初始化后端,再初始化前端,前端自动配置代理到后端
|
|
31
|
+
*/
|
|
32
|
+
async function initAdmin() {
|
|
33
|
+
console.log("\n🎯 正在初始化完整管理后台...\n");
|
|
34
|
+
|
|
35
|
+
// 1. 初始化后端(使用默认配置)
|
|
36
|
+
console.log("第一步:初始化后端");
|
|
37
|
+
await initBackend();
|
|
38
|
+
|
|
39
|
+
// 2. 初始化前端(使用默认配置)
|
|
40
|
+
console.log("\n第二步:初始化前端");
|
|
41
|
+
await initFrontend();
|
|
42
|
+
|
|
43
|
+
console.log("\n✨ 完整管理后台初始化成功!");
|
|
44
|
+
console.log("\n后续步骤:");
|
|
45
|
+
console.log(" 1. cd backend && npm install && npm run dev");
|
|
46
|
+
console.log(" 2. cd frontend && npm install && npm run dev");
|
|
47
|
+
console.log(" 3. 前端会自动代理 API 到后端 http://localhost:3000\n");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export default init;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SDK 文档复制命令
|
|
4
|
+
*
|
|
5
|
+
* 从已安装的 @mindbase/* 包中复制 sdk-docs 到宿主项目的 docs/sdk/ 目录
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { copyFileSync, readdirSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
|
|
11
|
+
interface PackageMeta {
|
|
12
|
+
name: string;
|
|
13
|
+
category: 'frontend' | 'server';
|
|
14
|
+
description: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// ==================== 主函数 ====================
|
|
18
|
+
|
|
19
|
+
function copySdkDocs(targetDir: string = process.cwd()): void {
|
|
20
|
+
const nodeModules = join(targetDir, 'node_modules');
|
|
21
|
+
const outputDir = join(targetDir, 'docs/sdk');
|
|
22
|
+
|
|
23
|
+
console.log('🔍 扫描已安装的 @mindbase 包...');
|
|
24
|
+
|
|
25
|
+
// 检查 node_modules 是否存在
|
|
26
|
+
if (!existsSync(nodeModules)) {
|
|
27
|
+
console.error('❌ 未找到 node_modules 目录');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 扫描 @mindbase 作用域下的包
|
|
32
|
+
const mindbaseScope = join(nodeModules, '@mindbase');
|
|
33
|
+
if (!existsSync(mindbaseScope)) {
|
|
34
|
+
console.warn('⚠️ 未找到 @mindbase 包');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const packages = readdirSync(mindbaseScope)
|
|
39
|
+
.filter((name) => {
|
|
40
|
+
const pkgPath = join(mindbaseScope, name);
|
|
41
|
+
return existsSync(join(pkgPath, 'dist/sdk-docs/README.md'));
|
|
42
|
+
})
|
|
43
|
+
.map((name) => {
|
|
44
|
+
const pkgPath = join(mindbaseScope, name);
|
|
45
|
+
const metaPath = join(pkgPath, 'sdk-meta.json');
|
|
46
|
+
|
|
47
|
+
let meta: PackageMeta = {
|
|
48
|
+
name: `@mindbase/${name}`,
|
|
49
|
+
category: name.includes('vue3') || name === 'ajax' || name === 'client' || name === 'types' ? 'frontend' : 'server',
|
|
50
|
+
description: '',
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// 尝试读取 sdk-meta.json
|
|
54
|
+
if (existsSync(metaPath)) {
|
|
55
|
+
try {
|
|
56
|
+
meta = JSON.parse(readFileSync(metaPath, 'utf-8'));
|
|
57
|
+
} catch {
|
|
58
|
+
// 解析失败,使用默认值
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return { name, meta };
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
console.log(`✅ 找到 ${packages.length} 个包含文档的包`);
|
|
66
|
+
|
|
67
|
+
if (packages.length === 0) {
|
|
68
|
+
console.warn('⚠️ 没有找到包含 SDK 文档的包');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 创建输出目录
|
|
73
|
+
mkdirSync(join(outputDir, 'frontend'), { recursive: true });
|
|
74
|
+
mkdirSync(join(outputDir, 'server'), { recursive: true });
|
|
75
|
+
|
|
76
|
+
// 复制各包文档
|
|
77
|
+
console.log('📝 复制 SDK 文档...');
|
|
78
|
+
for (const { name, meta } of packages) {
|
|
79
|
+
const category = meta.category;
|
|
80
|
+
const srcFile = join(mindbaseScope, name, 'dist/sdk-docs/README.md');
|
|
81
|
+
const destFile = join(outputDir, category, `@mindbase-${name}.md`);
|
|
82
|
+
|
|
83
|
+
copyFileSync(srcFile, destFile);
|
|
84
|
+
console.log(` ✅ ${meta.name} -> ${category}/@mindbase-${name}.md`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 生成总入口文档
|
|
88
|
+
console.log('📝 生成总入口文档...');
|
|
89
|
+
generateIndexDocs(outputDir, packages);
|
|
90
|
+
|
|
91
|
+
console.log('✅ SDK 文档复制完成!');
|
|
92
|
+
console.log(`📁 输出目录: ${outputDir}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ==================== 生成总入口文档 ====================
|
|
96
|
+
|
|
97
|
+
function generateIndexDocs(outputDir: string, packages: Array<{ name: string; meta: PackageMeta }>): void {
|
|
98
|
+
const frontendPkgs = packages.filter((p) => p.meta.category === 'frontend');
|
|
99
|
+
const serverPkgs = packages.filter((p) => p.meta.category === 'server');
|
|
100
|
+
|
|
101
|
+
// 生成前端总入口
|
|
102
|
+
const frontendDoc = generateCategoryDoc(frontendPkgs, 'frontend');
|
|
103
|
+
writeFileSync(join(outputDir, 'FRONTEND_SDK_REFERENCE.md'), frontendDoc);
|
|
104
|
+
|
|
105
|
+
// 生成后端总入口
|
|
106
|
+
const serverDoc = generateCategoryDoc(serverPkgs, 'server');
|
|
107
|
+
writeFileSync(join(outputDir, 'SERVER_SDK_REFERENCE.md'), serverDoc);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function generateCategoryDoc(packages: Array<{ name: string; meta: PackageMeta }>, category: string): string {
|
|
111
|
+
const categoryName = category === 'frontend' ? '前端' : '后端';
|
|
112
|
+
|
|
113
|
+
let doc = `# @mindbase ${categoryName} SDK 参考文档\n\n`;
|
|
114
|
+
doc += `> 自动生成于: ${new Date().toISOString().split('T')[0]}\n`;
|
|
115
|
+
doc += `> 由 @mindbase/cli 自动从已安装的包中提取\n\n`;
|
|
116
|
+
|
|
117
|
+
if (packages.length === 0) {
|
|
118
|
+
doc += `> 暂无 ${categoryName} SDK 文档\n`;
|
|
119
|
+
return doc;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// 包索引
|
|
123
|
+
doc += `## 已安装的包\n\n`;
|
|
124
|
+
doc += packages.map((p) => `- [\`${p.meta.name}\`](./${category}/@mindbase-${p.name}.md) - ${p.meta.description}`).join('\n');
|
|
125
|
+
doc += `\n`;
|
|
126
|
+
|
|
127
|
+
return doc;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ==================== CLI 入口 ====================
|
|
131
|
+
|
|
132
|
+
// 如果直接运行此脚本
|
|
133
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
134
|
+
const targetDir = process.argv[2] || process.cwd();
|
|
135
|
+
copySdkDocs(targetDir);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export { copySdkDocs };
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// 导出工具函数供外部使用
|
|
2
|
+
export { logger as default, type LogLevel } from "./utils/Logger";
|
|
3
|
+
export {
|
|
4
|
+
BACKEND_MODULES,
|
|
5
|
+
FRONTEND_APP_TYPES,
|
|
6
|
+
resolveDependencies,
|
|
7
|
+
getFrontendPackage,
|
|
8
|
+
getAvailableFrontendApps,
|
|
9
|
+
} from "./utils/prompts";
|
|
10
|
+
export {
|
|
11
|
+
type BackendConfig,
|
|
12
|
+
collectBackendConfig,
|
|
13
|
+
setupBackendPackageJson,
|
|
14
|
+
setupAppConfig,
|
|
15
|
+
setupDrizzleConfig,
|
|
16
|
+
setupTsConfig,
|
|
17
|
+
setupAppEntry,
|
|
18
|
+
copyAssets,
|
|
19
|
+
setupPrepareScript,
|
|
20
|
+
} from "./utils/BackendInitializer";
|
|
21
|
+
export {
|
|
22
|
+
type FrontendConfig,
|
|
23
|
+
collectFrontendConfig,
|
|
24
|
+
setupFrontendPackageJson,
|
|
25
|
+
setupViteConfig,
|
|
26
|
+
setupFrontendTsConfig,
|
|
27
|
+
setupIndexHtml,
|
|
28
|
+
setupAppFiles,
|
|
29
|
+
setupPublicDir,
|
|
30
|
+
} from "./utils/FrontendInitializer";
|
|
31
|
+
|
|
32
|
+
// 导出命令
|
|
33
|
+
export { init } from "./commands/init";
|