create-zhin-app 1.0.8 → 1.0.10
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/README.md +57 -10
- package/lib/config.d.ts +5 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +271 -0
- package/lib/config.js.map +1 -0
- package/lib/database.d.ts +3 -0
- package/lib/database.d.ts.map +1 -0
- package/lib/database.js +260 -0
- package/lib/database.js.map +1 -0
- package/lib/index.js +75 -380
- package/lib/index.js.map +1 -1
- package/lib/install.d.ts +3 -0
- package/lib/install.d.ts.map +1 -0
- package/lib/install.js +41 -0
- package/lib/install.js.map +1 -0
- package/lib/types.d.ts +21 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +9 -0
- package/lib/types.js.map +1 -0
- package/lib/utils.d.ts +4 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +26 -0
- package/lib/utils.js.map +1 -0
- package/lib/workspace.d.ts +3 -0
- package/lib/workspace.d.ts.map +1 -0
- package/lib/workspace.js +295 -0
- package/lib/workspace.js.map +1 -0
- package/package.json +1 -1
package/lib/utils.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import os from 'os';
|
|
2
|
+
// 生成随机密码
|
|
3
|
+
export function generateRandomPassword(length = 6) {
|
|
4
|
+
const chars = 'ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789';
|
|
5
|
+
let password = '';
|
|
6
|
+
for (let i = 0; i < length; i++) {
|
|
7
|
+
password += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
8
|
+
}
|
|
9
|
+
return password;
|
|
10
|
+
}
|
|
11
|
+
// 获取当前系统用户名
|
|
12
|
+
export function getCurrentUsername() {
|
|
13
|
+
return os.userInfo().username || 'admin';
|
|
14
|
+
}
|
|
15
|
+
// 获取数据库显示名称
|
|
16
|
+
export function getDatabaseDisplayName(dialect) {
|
|
17
|
+
const names = {
|
|
18
|
+
sqlite: 'SQLite',
|
|
19
|
+
mysql: 'MySQL',
|
|
20
|
+
pg: 'PostgreSQL',
|
|
21
|
+
mongodb: 'MongoDB',
|
|
22
|
+
redis: 'Redis'
|
|
23
|
+
};
|
|
24
|
+
return names[dialect] || dialect;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=utils.js.map
|
package/lib/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,SAAS;AACT,MAAM,UAAU,sBAAsB,CAAC,SAAiB,CAAC;IACvD,MAAM,KAAK,GAAG,wDAAwD,CAAC;IACvE,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,YAAY;AACZ,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,OAAO,CAAC;AAC3C,CAAC;AAED,YAAY;AACZ,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,KAAK,GAAG;QACZ,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,EAAE,EAAE,YAAY;QAChB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;KACf,CAAC;IACF,OAAO,KAAK,CAAC,OAA6B,CAAC,IAAI,OAAO,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAG5D,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,iBAuJnG"}
|
package/lib/workspace.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { DATABASE_PACKAGES } from './types.js';
|
|
4
|
+
import { createConfigFile, generateDatabaseEnvVars } from './config.js';
|
|
5
|
+
export async function createWorkspace(projectPath, projectName, options) {
|
|
6
|
+
await fs.ensureDir(projectPath);
|
|
7
|
+
// 创建 pnpm-workspace.yaml
|
|
8
|
+
await fs.writeFile(path.join(projectPath, 'pnpm-workspace.yaml'), `packages:
|
|
9
|
+
- '.'
|
|
10
|
+
- 'plugins/*'
|
|
11
|
+
`);
|
|
12
|
+
// 根据数据库类型添加相应依赖
|
|
13
|
+
const databaseDeps = {};
|
|
14
|
+
if (options.database) {
|
|
15
|
+
const dbPackage = DATABASE_PACKAGES[options.database.dialect];
|
|
16
|
+
if (dbPackage) {
|
|
17
|
+
databaseDeps[dbPackage] = 'latest';
|
|
18
|
+
}
|
|
19
|
+
// 总是添加数据库包
|
|
20
|
+
databaseDeps['@zhin.js/database'] = 'latest';
|
|
21
|
+
}
|
|
22
|
+
// 创建根 package.json(同时也是主应用的 package.json)
|
|
23
|
+
await fs.writeJson(path.join(projectPath, 'package.json'), {
|
|
24
|
+
name: `${projectName}`,
|
|
25
|
+
private: true,
|
|
26
|
+
version: '0.1.0',
|
|
27
|
+
type: 'module',
|
|
28
|
+
description: `${projectName} - Zhin.js Workspace`,
|
|
29
|
+
scripts: {
|
|
30
|
+
dev: 'zhin dev',
|
|
31
|
+
start: options.runtime === 'bun' ? 'zhin start --bun' : 'zhin start',
|
|
32
|
+
daemon: options.runtime === 'bun' ? 'zhin start --bun --daemon' : 'zhin start --daemon',
|
|
33
|
+
stop: 'zhin stop',
|
|
34
|
+
build: 'pnpm --filter "./plugins/*" build'
|
|
35
|
+
},
|
|
36
|
+
dependencies: {
|
|
37
|
+
'zhin.js': 'latest',
|
|
38
|
+
'@zhin.js/adapter-process': 'latest',
|
|
39
|
+
'@zhin.js/http': 'latest',
|
|
40
|
+
'@zhin.js/client': 'latest',
|
|
41
|
+
'@zhin.js/console': 'latest',
|
|
42
|
+
...databaseDeps
|
|
43
|
+
},
|
|
44
|
+
devDependencies: {
|
|
45
|
+
'@zhin.js/cli': 'latest',
|
|
46
|
+
'@zhin.js/types': 'latest',
|
|
47
|
+
'@types/node': 'latest',
|
|
48
|
+
'@types/react': 'latest',
|
|
49
|
+
'typescript': 'latest',
|
|
50
|
+
'react': 'latest',
|
|
51
|
+
'react-dom': 'latest',
|
|
52
|
+
'lucide-react': 'latest',
|
|
53
|
+
...(options.runtime === 'bun' ? { 'bun': 'latest' } : { 'tsx': 'latest' })
|
|
54
|
+
}
|
|
55
|
+
}, { spaces: 2 });
|
|
56
|
+
// 创建根 tsconfig.json
|
|
57
|
+
await fs.writeJson(path.join(projectPath, 'tsconfig.json'), {
|
|
58
|
+
compilerOptions: {
|
|
59
|
+
target: 'ES2022',
|
|
60
|
+
module: 'ESNext',
|
|
61
|
+
moduleResolution: 'bundler',
|
|
62
|
+
strict: true,
|
|
63
|
+
esModuleInterop: true,
|
|
64
|
+
skipLibCheck: true,
|
|
65
|
+
forceConsistentCasingInFileNames: true,
|
|
66
|
+
resolveJsonModule: true,
|
|
67
|
+
isolatedModules: true,
|
|
68
|
+
allowSyntheticDefaultImports: true,
|
|
69
|
+
experimentalDecorators: true,
|
|
70
|
+
emitDecoratorMetadata: true,
|
|
71
|
+
declaration: true,
|
|
72
|
+
sourceMap: true
|
|
73
|
+
}
|
|
74
|
+
}, { spaces: 2 });
|
|
75
|
+
// 创建 app 模块
|
|
76
|
+
await createAppModule(projectPath, projectName, options);
|
|
77
|
+
// 创建 plugins 目录
|
|
78
|
+
await fs.ensureDir(path.join(projectPath, 'plugins'));
|
|
79
|
+
await fs.writeFile(path.join(projectPath, 'plugins', '.gitkeep'), '');
|
|
80
|
+
// 创建 .gitignore
|
|
81
|
+
await fs.writeFile(path.join(projectPath, '.gitignore'), `node_modules/
|
|
82
|
+
dist/
|
|
83
|
+
lib/
|
|
84
|
+
*.log
|
|
85
|
+
.env
|
|
86
|
+
.env.local
|
|
87
|
+
.DS_Store
|
|
88
|
+
.zhin.pid
|
|
89
|
+
.zhin-dev.pid
|
|
90
|
+
data/
|
|
91
|
+
`);
|
|
92
|
+
// 创建 README.md
|
|
93
|
+
await fs.writeFile(path.join(projectPath, 'README.md'), `# ${projectName}
|
|
94
|
+
|
|
95
|
+
使用 Zhin.js 框架创建的 pnpm workspace 项目。
|
|
96
|
+
|
|
97
|
+
## 📁 项目结构
|
|
98
|
+
|
|
99
|
+
\`\`\`
|
|
100
|
+
${projectName}/
|
|
101
|
+
├── src/ # 应用源代码
|
|
102
|
+
│ └── plugins/ # 本地插件
|
|
103
|
+
├── client/ # 客户端页面
|
|
104
|
+
├── data/ # 数据目录
|
|
105
|
+
├── plugins/ # 插件开发目录(独立包)
|
|
106
|
+
├── zhin.config.${options.config} # 配置文件
|
|
107
|
+
└── pnpm-workspace.yaml
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
## 🚀 快速开始
|
|
111
|
+
|
|
112
|
+
\`\`\`bash
|
|
113
|
+
pnpm dev # 开发环境
|
|
114
|
+
pnpm start # 生产环境
|
|
115
|
+
pnpm stop # 停止
|
|
116
|
+
pnpm build # 构建所有插件
|
|
117
|
+
\`\`\`
|
|
118
|
+
|
|
119
|
+
## 🔌 插件开发
|
|
120
|
+
|
|
121
|
+
\`\`\`bash
|
|
122
|
+
# 创建新插件
|
|
123
|
+
zhin new my-plugin
|
|
124
|
+
|
|
125
|
+
# 构建插件
|
|
126
|
+
pnpm build
|
|
127
|
+
|
|
128
|
+
# 构建特定插件
|
|
129
|
+
pnpm --filter @zhin.js/my-plugin build
|
|
130
|
+
\`\`\`
|
|
131
|
+
|
|
132
|
+
插件创建后会自动添加到 package.json,在配置文件中启用即可:
|
|
133
|
+
|
|
134
|
+
\`\`\`typescript
|
|
135
|
+
export default defineConfig({
|
|
136
|
+
plugins: ['my-plugin']
|
|
137
|
+
});
|
|
138
|
+
\`\`\`
|
|
139
|
+
|
|
140
|
+
## 📚 文档
|
|
141
|
+
|
|
142
|
+
- [官方文档](https://zhinjs.github.io)
|
|
143
|
+
- [GitHub](https://github.com/zhinjs/zhin)
|
|
144
|
+
`);
|
|
145
|
+
}
|
|
146
|
+
async function createAppModule(projectPath, projectName, options) {
|
|
147
|
+
// 创建目录结构(根目录即为应用目录)
|
|
148
|
+
await fs.ensureDir(path.join(projectPath, 'src'));
|
|
149
|
+
await fs.ensureDir(path.join(projectPath, 'src', 'plugins'));
|
|
150
|
+
await fs.ensureDir(path.join(projectPath, 'client'));
|
|
151
|
+
await fs.ensureDir(path.join(projectPath, 'data'));
|
|
152
|
+
// 创建 .env 文件
|
|
153
|
+
const databaseEnvVars = options.database ? generateDatabaseEnvVars(options.database) : '';
|
|
154
|
+
await fs.writeFile(path.join(projectPath, '.env'), `# 调试模式
|
|
155
|
+
DEBUG=true
|
|
156
|
+
|
|
157
|
+
# 插件目录
|
|
158
|
+
# PLUGIN_DIR=./src/plugins
|
|
159
|
+
|
|
160
|
+
# HTTP 服务配置(Web 控制台登录信息)
|
|
161
|
+
HTTP_USERNAME=${options.httpUsername}
|
|
162
|
+
HTTP_PASSWORD=${options.httpPassword}${databaseEnvVars}
|
|
163
|
+
`);
|
|
164
|
+
// app/tsconfig.json
|
|
165
|
+
await fs.writeJson(path.join(projectPath, 'tsconfig.json'), {
|
|
166
|
+
extends: '../tsconfig.json',
|
|
167
|
+
compilerOptions: {
|
|
168
|
+
baseUrl: './src',
|
|
169
|
+
jsx: 'react-jsx',
|
|
170
|
+
jsxImportSource: 'zhin.js',
|
|
171
|
+
noEmit: false,
|
|
172
|
+
types: ['@types/node', '@zhin.js/types', 'zhin.js']
|
|
173
|
+
},
|
|
174
|
+
include: ['src/**/*'],
|
|
175
|
+
exclude: ['node_modules', 'data']
|
|
176
|
+
}, { spaces: 2 });
|
|
177
|
+
// app/src/index.ts
|
|
178
|
+
await fs.writeFile(path.join(projectPath, 'src', 'index.ts'), `import { createApp } from 'zhin.js';
|
|
179
|
+
|
|
180
|
+
async function main() {
|
|
181
|
+
try {
|
|
182
|
+
const app = await createApp();
|
|
183
|
+
await app.start();
|
|
184
|
+
|
|
185
|
+
const shutdown = async () => {
|
|
186
|
+
await app.stop();
|
|
187
|
+
process.exit(0);
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
process.on('SIGINT', shutdown);
|
|
191
|
+
process.on('SIGTERM', shutdown);
|
|
192
|
+
} catch (error) {
|
|
193
|
+
console.error('启动失败:', error);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
main().catch(console.error);
|
|
199
|
+
`);
|
|
200
|
+
// app/src/plugins/example.ts
|
|
201
|
+
await fs.writeFile(path.join(projectPath, 'src', 'plugins', 'example.ts'), `import { useLogger, addCommand, MessageCommand, useContext, onDispose } from 'zhin.js';
|
|
202
|
+
import * as path from 'path';
|
|
203
|
+
|
|
204
|
+
const logger = useLogger();
|
|
205
|
+
|
|
206
|
+
addCommand(new MessageCommand('hello')
|
|
207
|
+
.action(async (message) => {
|
|
208
|
+
logger.info('Hello command from:', message.$sender.name);
|
|
209
|
+
return '你好!欢迎使用 Zhin.js!';
|
|
210
|
+
})
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
addCommand(new MessageCommand('status')
|
|
214
|
+
.action(() => {
|
|
215
|
+
const uptime = process.uptime();
|
|
216
|
+
const memory = process.memoryUsage();
|
|
217
|
+
return [
|
|
218
|
+
'🤖 状态',
|
|
219
|
+
\`运行时间: \${Math.floor(uptime / 60)}分钟\`,
|
|
220
|
+
\`内存: \${(memory.rss / 1024 / 1024).toFixed(2)}MB\`
|
|
221
|
+
].join('\\n');
|
|
222
|
+
})
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
onDispose(() => {
|
|
226
|
+
logger.info('示例插件已卸载');
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
useContext('web',(web)=>{
|
|
230
|
+
web.addEntry(path.resolve(process.cwd(),'client/index.tsx'))
|
|
231
|
+
});
|
|
232
|
+
logger.info('示例插件已加载');
|
|
233
|
+
`);
|
|
234
|
+
// app/client/index.tsx
|
|
235
|
+
await fs.writeFile(path.join(projectPath, 'client', 'index.tsx'), `import { addPage } from '@zhin.js/client';
|
|
236
|
+
import { Home } from 'lucide-react';
|
|
237
|
+
|
|
238
|
+
function HomePage() {
|
|
239
|
+
return (
|
|
240
|
+
<div className="p-6">
|
|
241
|
+
<div className="max-w-4xl mx-auto">
|
|
242
|
+
<div className="text-center mb-8">
|
|
243
|
+
<h1 className="text-3xl font-bold text-gray-900 mb-4">
|
|
244
|
+
🤖 欢迎使用 Zhin.js
|
|
245
|
+
</h1>
|
|
246
|
+
<p className="text-lg text-gray-600">
|
|
247
|
+
现代化的 TypeScript 机器人框架
|
|
248
|
+
</p>
|
|
249
|
+
</div>
|
|
250
|
+
|
|
251
|
+
<div className="grid md:grid-cols-2 gap-6">
|
|
252
|
+
<div className="bg-white rounded-lg shadow-md p-6">
|
|
253
|
+
<h2 className="text-xl font-semibold mb-3">🚀 快速开始</h2>
|
|
254
|
+
<ul className="space-y-2 text-gray-600">
|
|
255
|
+
<li>• 创建插件: <code className="bg-gray-100 px-2 py-1 rounded">zhin new my-plugin</code></li>
|
|
256
|
+
<li>• 编辑配置: 修改 <code className="bg-gray-100 px-2 py-1 rounded">zhin.config.ts</code></li>
|
|
257
|
+
<li>• 查看日志: <code className="bg-gray-100 px-2 py-1 rounded">pnpm dev</code></li>
|
|
258
|
+
</ul>
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
<div className="bg-white rounded-lg shadow-md p-6">
|
|
262
|
+
<h2 className="text-xl font-semibold mb-3">📚 文档链接</h2>
|
|
263
|
+
<ul className="space-y-2">
|
|
264
|
+
<li>
|
|
265
|
+
<a href="https://zhinjs.github.io" target="_blank" rel="noopener noreferrer"
|
|
266
|
+
className="text-blue-600 hover:text-blue-800">
|
|
267
|
+
官方文档
|
|
268
|
+
</a>
|
|
269
|
+
</li>
|
|
270
|
+
<li>
|
|
271
|
+
<a href="https://github.com/zhinjs/zhin" target="_blank" rel="noopener noreferrer"
|
|
272
|
+
className="text-blue-600 hover:text-blue-800">
|
|
273
|
+
GitHub 仓库
|
|
274
|
+
</a>
|
|
275
|
+
</li>
|
|
276
|
+
</ul>
|
|
277
|
+
</div>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
</div>
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
addPage({
|
|
285
|
+
key: 'home',
|
|
286
|
+
path: '/',
|
|
287
|
+
title: '首页',
|
|
288
|
+
icon: <Home className="w-5 h-5" />,
|
|
289
|
+
element: <HomePage />
|
|
290
|
+
});
|
|
291
|
+
`);
|
|
292
|
+
// 创建配置文件
|
|
293
|
+
await createConfigFile(projectPath, options.config, options);
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|