yzkit 1.0.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.
Files changed (3) hide show
  1. package/README.md +12 -0
  2. package/bin/index.js +88 -0
  3. package/package.json +19 -0
package/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # 🛠️ yzkit
2
+
3
+ A CLI tool to scaffold **UI components** and **modules** for your project, inspired by `shadcn/ui`.
4
+
5
+ ---
6
+
7
+ ## 🚀 快速开始
8
+
9
+ 无需安装,使用 `pnpm dlx` 直接运行:
10
+
11
+ ```bash
12
+ pnpm dlx yzkit
package/bin/index.js ADDED
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const { copySync } = require("fs-extra");
6
+ const inquirer = require("inquirer");
7
+ const degit = require("degit");
8
+
9
+ const LOCAL_TEMPLATE_ROOT = path.resolve(__dirname, "../templates");
10
+ const CACHE_DIR = path.resolve(__dirname, "../.cache/templates");
11
+ const GITHUB_REPO = "youzi20/yz-cli/templates"; // 改成你的仓库地址
12
+
13
+ const TYPE_MAP = {
14
+ ui: {
15
+ label: "基础 UI 组件",
16
+ subdir: "ui",
17
+ destDir: "src/components"
18
+ },
19
+ module: {
20
+ label: "业务功能模块",
21
+ subdir: "modules",
22
+ destDir: "src/modules"
23
+ }
24
+ };
25
+
26
+ async function ensureTemplatesFromGitHub(subdir) {
27
+ const cachePath = path.join(CACHE_DIR, subdir);
28
+ if (!fs.existsSync(cachePath)) {
29
+ console.log(`🌐 正在从 GitHub 拉取模板 ${subdir} ...`);
30
+ const emitter = degit(`${GITHUB_REPO}/${subdir}`, {
31
+ cache: true,
32
+ force: true,
33
+ verbose: false
34
+ });
35
+ await emitter.clone(cachePath);
36
+ }
37
+ return cachePath;
38
+ }
39
+
40
+ async function main() {
41
+ const { type } = await inquirer.prompt([
42
+ {
43
+ type: "list",
44
+ name: "type",
45
+ message: "请选择要添加的类型:",
46
+ choices: Object.entries(TYPE_MAP).map(([key, value]) => ({
47
+ name: value.label,
48
+ value: key
49
+ }))
50
+ }
51
+ ]);
52
+
53
+ const config = TYPE_MAP[type];
54
+
55
+ // 优先从 GitHub 获取远程模板
56
+ const templateDir = await ensureTemplatesFromGitHub(config.subdir);
57
+
58
+ const available = fs.readdirSync(templateDir).filter((f) =>
59
+ fs.statSync(path.join(templateDir, f)).isDirectory()
60
+ );
61
+
62
+ if (available.length === 0) {
63
+ console.error(`❌ 没有可用模板`);
64
+ process.exit(1);
65
+ }
66
+
67
+ const { selected } = await inquirer.prompt([
68
+ {
69
+ type: "list",
70
+ name: "selected",
71
+ message: `请选择要添加的${config.label}:`,
72
+ choices: available
73
+ }
74
+ ]);
75
+
76
+ const src = path.join(templateDir, selected);
77
+ const dest = path.resolve(process.cwd(), config.destDir, selected);
78
+
79
+ if (fs.existsSync(dest)) {
80
+ console.error(`❌ 目标目录已存在: ${dest}`);
81
+ process.exit(1);
82
+ }
83
+
84
+ copySync(src, dest);
85
+ console.log(`✅ 已成功添加 ${config.label}:${selected} 到 ${dest}`);
86
+ }
87
+
88
+ main();
package/package.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "yzkit",
3
+ "version": "1.0.0",
4
+ "description": "A CLI tool to scaffold modules and components",
5
+ "bin": {
6
+ "yzkit": "./bin/index.js"
7
+ },
8
+ "scripts": {
9
+ "start": "node ./bin/index.js"
10
+ },
11
+ "engines": {
12
+ "node": ">=14"
13
+ },
14
+ "dependencies": {
15
+ "fs-extra": "^11.1.1",
16
+ "inquirer": "^9.2.12",
17
+ "degit": "^2.8.5"
18
+ }
19
+ }