@lppx/nlearn 1.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.
Files changed (19) hide show
  1. package/dist/scripts/sync-repo.js +100 -0
  2. package/dist/src/cli/cli.js +9 -0
  3. package/dist/src/demo/commander/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +174 -0
  4. package/dist/src/demo/commander/02-/345/221/275/344/273/244/347/263/273/347/273/237.js +260 -0
  5. package/dist/src/demo/commander/03-/351/253/230/347/272/247/347/211/271/346/200/247.js +285 -0
  6. package/dist/src/demo/commander/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +408 -0
  7. package/dist/src/demo/esm/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +226 -0
  8. package/dist/src/demo/esm/02-/345/257/274/345/207/272/350/257/255/346/263/225.js +281 -0
  9. package/dist/src/demo/esm/03-/345/257/274/345/205/245/350/257/255/346/263/225.js +366 -0
  10. package/dist/src/demo/esm/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +509 -0
  11. package/dist/src/demo/inquirer/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +135 -0
  12. package/dist/src/demo/inquirer/02-/351/200/211/346/213/251/347/261/273/345/236/213.js +143 -0
  13. package/dist/src/demo/inquirer/03-/351/253/230/347/272/247/347/211/271/346/200/247.js +211 -0
  14. package/dist/src/demo/inquirer/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +343 -0
  15. package/dist/src/demo/yargs/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +142 -0
  16. package/dist/src/demo/yargs/02-/345/221/275/344/273/244/347/263/273/347/273/237.js +211 -0
  17. package/dist/src/demo/yargs/03-/351/253/230/347/272/247/347/211/271/346/200/247.js +205 -0
  18. package/dist/src/demo/yargs/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +276 -0
  19. package/package.json +39 -0
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const child_process_1 = require("child_process");
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ // #region 颜色定义
8
+ const colors = {
9
+ red: '\x1b[0;31m',
10
+ green: '\x1b[0;32m',
11
+ yellow: '\x1b[1;33m',
12
+ reset: '\x1b[0m',
13
+ };
14
+ // #endregion
15
+ // #region 辅助函数
16
+ function printSuccess(message) {
17
+ console.log(`${colors.green}✓ ${message}${colors.reset}`);
18
+ }
19
+ function printError(message) {
20
+ console.error(`${colors.red}✗ ${message}${colors.reset}`);
21
+ }
22
+ function printWarning(message) {
23
+ console.log(`${colors.yellow}⚠ ${message}${colors.reset}`);
24
+ }
25
+ // #endregion
26
+ // #region Git 操作
27
+ function execGit(command) {
28
+ try {
29
+ return (0, child_process_1.execSync)(`git ${command}`, {
30
+ encoding: 'utf-8',
31
+ stdio: ['pipe', 'pipe', 'pipe']
32
+ }).trim();
33
+ }
34
+ catch (error) {
35
+ throw new Error(error.stderr || error.message);
36
+ }
37
+ }
38
+ async function syncRepo() {
39
+ const dir = process.cwd();
40
+ console.log('开始同步仓库...');
41
+ // 检查是否在 git 仓库中
42
+ if (!(0, fs_1.existsSync)((0, path_1.join)(dir, '.git'))) {
43
+ printError('当前目录不是 git 仓库');
44
+ process.exit(1);
45
+ }
46
+ // 执行 git pull
47
+ console.log('正在拉取远程更改...');
48
+ try {
49
+ execGit('pull');
50
+ printSuccess('成功拉取远程更改');
51
+ }
52
+ catch (error) {
53
+ printError('拉取失败,可能存在冲突');
54
+ printWarning('请手动解决冲突后再运行此脚本');
55
+ console.error(error.message);
56
+ process.exit(1);
57
+ }
58
+ // 检查是否有更改需要提交
59
+ const status = execGit('status --porcelain');
60
+ if (!status) {
61
+ printWarning('没有需要提交的更改');
62
+ process.exit(0);
63
+ }
64
+ // 添加所有更改
65
+ console.log('正在添加所有更改...');
66
+ execGit('add -A');
67
+ printSuccess('已添加所有更改');
68
+ // 生成 commit message(当前日期和时间)
69
+ const now = new Date();
70
+ const commitMsg = now.toLocaleString('zh-CN', {
71
+ year: 'numeric',
72
+ month: '2-digit',
73
+ day: '2-digit',
74
+ hour: '2-digit',
75
+ minute: '2-digit',
76
+ second: '2-digit',
77
+ hour12: false,
78
+ }).replace(/\//g, '-');
79
+ console.log('正在提交更改...');
80
+ execGit(`commit -m "${commitMsg}"`);
81
+ printSuccess(`提交成功: ${commitMsg}`);
82
+ // 推送到远程仓库
83
+ console.log('正在推送到远程仓库...');
84
+ try {
85
+ execGit('push');
86
+ printSuccess('成功推送到远程仓库');
87
+ }
88
+ catch (error) {
89
+ printError('推送失败');
90
+ console.error(error.message);
91
+ process.exit(1);
92
+ }
93
+ printSuccess('仓库同步完成!');
94
+ }
95
+ // #endregion
96
+ // 执行主函数
97
+ syncRepo().catch((error) => {
98
+ printError(`发生错误: ${error.message}`);
99
+ process.exit(1);
100
+ });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const commander_1 = require("commander");
4
+ const program = new commander_1.Command();
5
+ program
6
+ .name('nlearn')
7
+ .description('nodejs 生态学习工具')
8
+ .version('1.0.0');
9
+ program.parse(process.argv);
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Commander.js 基础概念
4
+ * ======================
5
+ * Commander.js 是 Node.js 中最流行的命令行接口(CLI)解决方案
6
+ * 本文件涵盖:程序初始化、版本号、描述、基本选项和参数
7
+ * 适用版本:commander ^12.0.0
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const commander_1 = require("commander");
11
+ // #region 示例1: 最简单的 CLI 程序
12
+ function demoSimplestCLI() {
13
+ const program = new commander_1.Command();
14
+ // 设置程序名称、描述和版本
15
+ program
16
+ .name('my-cli')
17
+ .description('我的第一个 CLI 工具')
18
+ .version('1.0.0');
19
+ // 解析命令行参数
20
+ program.parse(process.argv);
21
+ console.log('示例1: 最简单的 CLI 程序已运行');
22
+ console.log('提示: 尝试运行 ts-node src/demo/commander/01-基础概念.ts --version');
23
+ }
24
+ // #endregion
25
+ // #region 示例2: 添加选项(Options)
26
+ function demoOptionsUsage() {
27
+ const program = new commander_1.Command();
28
+ program
29
+ .name('file-processor')
30
+ .description('文件处理工具')
31
+ .version('1.0.0')
32
+ // 添加布尔选项(flag)
33
+ .option('-d, --debug', '启用调试模式')
34
+ // 添加带值的选项
35
+ .option('-p, --port <number>', '指定端口号', '3000')
36
+ // 添加可选值的选项
37
+ .option('-e, --env [environment]', '指定环境', 'development');
38
+ program.parse(process.argv);
39
+ const options = program.opts();
40
+ console.log('\n示例2: 选项解析结果:');
41
+ console.log('调试模式:', options.debug || false);
42
+ console.log('端口号:', options.port);
43
+ console.log('环境:', options.env);
44
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/01-基础概念.ts 2 -d -p 8080 -e production');
45
+ }
46
+ // #endregion
47
+ // #region 示例3: 必需参数和可选参数
48
+ function demoRequiredAndOptionalArgs() {
49
+ const program = new commander_1.Command();
50
+ program
51
+ .name('file-copy')
52
+ .description('文件复制工具')
53
+ .version('1.0.0')
54
+ // <> 表示必需参数,[] 表示可选参数
55
+ .argument('<source>', '源文件路径')
56
+ .argument('[destination]', '目标文件路径', './output')
57
+ .action((source, destination) => {
58
+ console.log('\n示例3: 参数解析结果:');
59
+ console.log('源文件:', source);
60
+ console.log('目标文件:', destination);
61
+ });
62
+ program.parse(process.argv);
63
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/01-基础概念.ts 3 input.txt output.txt');
64
+ }
65
+ // #endregion
66
+ // #region 示例4: 变长参数
67
+ function demoVariadicArgs() {
68
+ const program = new commander_1.Command();
69
+ program
70
+ .name('file-merger')
71
+ .description('合并多个文件')
72
+ .version('1.0.0')
73
+ // ... 表示可以接收多个参数
74
+ .argument('<files...>', '要合并的文件列表')
75
+ .option('-o, --output <file>', '输出文件名', 'merged.txt')
76
+ .action((files, options) => {
77
+ console.log('\n示例4: 变长参数解析:');
78
+ console.log('输入文件:', files);
79
+ console.log('输出文件:', options.output);
80
+ });
81
+ program.parse(process.argv);
82
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/01-基础概念.ts 4 file1.txt file2.txt file3.txt -o result.txt');
83
+ }
84
+ // #endregion
85
+ // #region 示例5: 自定义帮助信息
86
+ function demoCustomHelp() {
87
+ const program = new commander_1.Command();
88
+ program
89
+ .name('custom-help')
90
+ .description('演示自定义帮助信息')
91
+ .version('1.0.0')
92
+ .option('-c, --config <path>', '配置文件路径')
93
+ // 添加额外的帮助信息
94
+ .addHelpText('after', `
95
+ 示例用法:
96
+ $ custom-help -c ./config.json
97
+ $ custom-help --help
98
+
99
+ 更多信息请访问: https://github.com/tj/commander.js
100
+ `);
101
+ program.parse(process.argv);
102
+ console.log('\n示例5: 自定义帮助信息');
103
+ console.log('提示: 尝试运行 ts-node src/demo/commander/01-基础概念.ts 5 --help');
104
+ }
105
+ // #endregion
106
+ // #region 示例6: 选项的默认值和类型转换
107
+ function demoTypeConversion() {
108
+ const program = new commander_1.Command();
109
+ program
110
+ .name('type-converter')
111
+ .description('演示选项的类型转换')
112
+ .version('1.0.0')
113
+ // 使用自定义函数进行类型转换
114
+ .option('-n, --number <value>', '整数值', parseInt)
115
+ .option('-f, --float <value>', '浮点数值', parseFloat)
116
+ .option('-l, --list <items>', '逗号分隔的列表', (value) => value.split(','))
117
+ .option('-r, --range <a>..<b>', '范围值', (value) => {
118
+ const [start, end] = value.split('..').map(Number);
119
+ return { start, end };
120
+ });
121
+ program.parse(process.argv);
122
+ const options = program.opts();
123
+ console.log('\n示例6: 类型转换结果:');
124
+ console.log('整数:', options.number, typeof options.number);
125
+ console.log('浮点数:', options.float, typeof options.float);
126
+ console.log('列表:', options.list);
127
+ console.log('范围:', options.range);
128
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/01-基础概念.ts 6 -n 42 -f 3.14 -l a,b,c -r 1..10');
129
+ }
130
+ // #endregion
131
+ if (require.main === module) {
132
+ // 从环境变量读取示例编号,避免与 commander 参数冲突
133
+ const exampleNumber = process.env.EXAMPLE || process.argv[2];
134
+ // console.log('='.repeat(60));
135
+ // console.log('Commander.js 基础概念示例');
136
+ // console.log('='.repeat(60));
137
+ switch (exampleNumber) {
138
+ case '1':
139
+ // 移除示例编号参数,避免 commander 解析错误
140
+ process.argv.splice(2, 1);
141
+ demoSimplestCLI();
142
+ break;
143
+ case '2':
144
+ process.argv.splice(2, 1);
145
+ demoOptionsUsage();
146
+ break;
147
+ case '3':
148
+ process.argv.splice(2, 1);
149
+ demoRequiredAndOptionalArgs();
150
+ break;
151
+ case '4':
152
+ process.argv.splice(2, 1);
153
+ demoVariadicArgs();
154
+ break;
155
+ case '5':
156
+ process.argv.splice(2, 1);
157
+ demoCustomHelp();
158
+ break;
159
+ case '6':
160
+ process.argv.splice(2, 1);
161
+ demoTypeConversion();
162
+ break;
163
+ default:
164
+ console.log('\n请指定要运行的示例编号 (1-6)');
165
+ console.log('用法: ts-node src/demo/commander/01-基础概念.ts <示例编号> [选项]');
166
+ console.log('\n可用示例:');
167
+ console.log(' 1 - 最简单的 CLI 程序');
168
+ console.log(' 2 - 添加选项(Options)');
169
+ console.log(' 3 - 必需参数和可选参数');
170
+ console.log(' 4 - 变长参数');
171
+ console.log(' 5 - 自定义帮助信息');
172
+ console.log(' 6 - 选项的默认值和类型转换');
173
+ }
174
+ }
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ /**
3
+ * Commander.js 命令系统
4
+ * ======================
5
+ * 本文件涵盖:子命令、命令别名、命令参数、命令选项
6
+ * 适用版本:commander ^12.0.0
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const commander_1 = require("commander");
10
+ // #region 示例1: 基本子命令
11
+ function demoBasicSubcommands() {
12
+ const program = new commander_1.Command();
13
+ program
14
+ .name('git-like')
15
+ .description('类似 Git 的命令行工具')
16
+ .version('1.0.0');
17
+ // 添加 clone 子命令
18
+ program
19
+ .command('clone <repository>')
20
+ .description('克隆一个仓库')
21
+ .action((repository) => {
22
+ console.log('\n示例1: 执行 clone 命令');
23
+ console.log('克隆仓库:', repository);
24
+ });
25
+ // 添加 init 子命令
26
+ program
27
+ .command('init')
28
+ .description('初始化一个新仓库')
29
+ .action(() => {
30
+ console.log('\n示例1: 执行 init 命令');
31
+ console.log('初始化新仓库...');
32
+ });
33
+ program.parse(process.argv);
34
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/02-命令系统.ts 1 clone https://github.com/user/repo.git');
35
+ }
36
+ // #endregion
37
+ // #region 示例2: 命令别名
38
+ function demoCommandAliases() {
39
+ const program = new commander_1.Command();
40
+ program
41
+ .name('npm-like')
42
+ .description('类似 NPM 的命令行工具')
43
+ .version('1.0.0');
44
+ // install 命令,别名为 i
45
+ program
46
+ .command('install [packages...]')
47
+ .alias('i')
48
+ .description('安装包')
49
+ .action((packages) => {
50
+ console.log('\n示例2: 执行 install 命令');
51
+ console.log('安装包:', packages.length > 0 ? packages : '所有依赖');
52
+ });
53
+ // uninstall 命令,别名为 un 和 remove
54
+ program
55
+ .command('uninstall <packages...>')
56
+ .aliases(['un', 'remove', 'rm'])
57
+ .description('卸载包')
58
+ .action((packages) => {
59
+ console.log('\n示例2: 执行 uninstall 命令');
60
+ console.log('卸载包:', packages);
61
+ });
62
+ program.parse(process.argv);
63
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/02-命令系统.ts 2 i express lodash');
64
+ console.log('或: ts-node src/demo/commander/02-命令系统.ts 2 rm express');
65
+ }
66
+ // #endregion
67
+ // #region 示例3: 命令特定选项
68
+ function demoCommandSpecificOptions() {
69
+ const program = new commander_1.Command();
70
+ program
71
+ .name('docker-like')
72
+ .description('类似 Docker 的命令行工具')
73
+ .version('1.0.0');
74
+ // run 命令带有自己的选项
75
+ program
76
+ .command('run <image>')
77
+ .description('运行容器')
78
+ .option('-d, --detach', '后台运行')
79
+ .option('-p, --port <port>', '端口映射')
80
+ .option('--name <name>', '容器名称')
81
+ .action((image, options) => {
82
+ console.log('\n示例3: 执行 run 命令');
83
+ console.log('镜像:', image);
84
+ console.log('后台运行:', options.detach || false);
85
+ console.log('端口映射:', options.port || '未指定');
86
+ console.log('容器名称:', options.name || '自动生成');
87
+ });
88
+ // build 命令带有不同的选项
89
+ program
90
+ .command('build <path>')
91
+ .description('构建镜像')
92
+ .option('-t, --tag <tag>', '镜像标签')
93
+ .option('-f, --file <dockerfile>', 'Dockerfile 路径', 'Dockerfile')
94
+ .action((path, options) => {
95
+ console.log('\n示例3: 执行 build 命令');
96
+ console.log('构建路径:', path);
97
+ console.log('镜像标签:', options.tag || '未指定');
98
+ console.log('Dockerfile:', options.file);
99
+ });
100
+ program.parse(process.argv);
101
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/02-命令系统.ts 3 run nginx -d -p 8080 --name my-nginx');
102
+ }
103
+ // #endregion
104
+ // #region 示例4: 嵌套子命令
105
+ function demoNestedSubcommands() {
106
+ const program = new commander_1.Command();
107
+ program
108
+ .name('cloud-cli')
109
+ .description('云服务命令行工具')
110
+ .version('1.0.0');
111
+ // 创建 database 命令组
112
+ const database = program
113
+ .command('database')
114
+ .alias('db')
115
+ .description('数据库管理命令');
116
+ // database 的子命令
117
+ database
118
+ .command('create <name>')
119
+ .description('创建数据库')
120
+ .option('--type <type>', '数据库类型', 'mysql')
121
+ .action((name, options) => {
122
+ console.log('\n示例4: 执行 database create 命令');
123
+ console.log('数据库名称:', name);
124
+ console.log('数据库类型:', options.type);
125
+ });
126
+ database
127
+ .command('delete <name>')
128
+ .description('删除数据库')
129
+ .option('-f, --force', '强制删除')
130
+ .action((name, options) => {
131
+ console.log('\n示例4: 执行 database delete 命令');
132
+ console.log('数据库名称:', name);
133
+ console.log('强制删除:', options.force || false);
134
+ });
135
+ // 创建 storage 命令组
136
+ const storage = program
137
+ .command('storage')
138
+ .description('存储管理命令');
139
+ storage
140
+ .command('upload <file>')
141
+ .description('上传文件')
142
+ .option('-b, --bucket <bucket>', '存储桶名称')
143
+ .action((file, options) => {
144
+ console.log('\n示例4: 执行 storage upload 命令');
145
+ console.log('文件:', file);
146
+ console.log('存储桶:', options.bucket || '默认');
147
+ });
148
+ program.parse(process.argv);
149
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/02-命令系统.ts 4 db create mydb --type postgres');
150
+ }
151
+ // #endregion
152
+ // #region 示例5: 默认命令和命令钩子
153
+ function demoDefaultCommand() {
154
+ const program = new commander_1.Command();
155
+ program
156
+ .name('server-cli')
157
+ .description('服务器管理工具')
158
+ .version('1.0.0');
159
+ program
160
+ .command('start')
161
+ .description('启动服务器')
162
+ .option('-p, --port <port>', '端口号', '3000')
163
+ .action((options) => {
164
+ console.log('\n示例5: 启动服务器');
165
+ console.log('端口:', options.port);
166
+ });
167
+ program
168
+ .command('stop')
169
+ .description('停止服务器')
170
+ .action(() => {
171
+ console.log('\n示例5: 停止服务器');
172
+ });
173
+ // 设置默认命令
174
+ program
175
+ .command('status', { isDefault: true })
176
+ .description('查看服务器状态(默认命令)')
177
+ .action(() => {
178
+ console.log('\n示例5: 查看服务器状态');
179
+ console.log('服务器运行中...');
180
+ });
181
+ program.parse(process.argv);
182
+ console.log('\n提示: 直接运行 ts-node src/demo/commander/02-命令系统.ts 5 将执行默认命令');
183
+ }
184
+ // #endregion
185
+ // #region 示例6: 命令参数验证
186
+ function demoArgumentValidation() {
187
+ const program = new commander_1.Command();
188
+ program
189
+ .name('user-manager')
190
+ .description('用户管理工具')
191
+ .version('1.0.0');
192
+ program
193
+ .command('create <username>')
194
+ .description('创建用户')
195
+ .option('-a, --age <age>', '年龄', (value) => {
196
+ const age = parseInt(value);
197
+ if (isNaN(age) || age < 0 || age > 150) {
198
+ throw new Error('年龄必须是 0-150 之间的数字');
199
+ }
200
+ return age;
201
+ })
202
+ .option('-e, --email <email>', '邮箱', (value) => {
203
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
204
+ throw new Error('邮箱格式不正确');
205
+ }
206
+ return value;
207
+ })
208
+ .action((username, options) => {
209
+ console.log('\n示例6: 创建用户');
210
+ console.log('用户名:', username);
211
+ console.log('年龄:', options.age || '未指定');
212
+ console.log('邮箱:', options.email || '未指定');
213
+ });
214
+ program.parse(process.argv);
215
+ console.log('\n提示: 尝试运行 ts-node src/demo/commander/02-命令系统.ts 6 create john -a 25 -e john@example.com');
216
+ console.log('或尝试错误输入: ts-node src/demo/commander/02-命令系统.ts 6 create john -a 200');
217
+ }
218
+ // #endregion
219
+ if (require.main === module) {
220
+ const exampleNumber = process.env.EXAMPLE || process.argv[2];
221
+ console.log('='.repeat(60));
222
+ console.log('Commander.js 命令系统示例');
223
+ console.log('='.repeat(60));
224
+ switch (exampleNumber) {
225
+ case '1':
226
+ process.argv.splice(2, 1);
227
+ demoBasicSubcommands();
228
+ break;
229
+ case '2':
230
+ process.argv.splice(2, 1);
231
+ demoCommandAliases();
232
+ break;
233
+ case '3':
234
+ process.argv.splice(2, 1);
235
+ demoCommandSpecificOptions();
236
+ break;
237
+ case '4':
238
+ process.argv.splice(2, 1);
239
+ demoNestedSubcommands();
240
+ break;
241
+ case '5':
242
+ process.argv.splice(2, 1);
243
+ demoDefaultCommand();
244
+ break;
245
+ case '6':
246
+ process.argv.splice(2, 1);
247
+ demoArgumentValidation();
248
+ break;
249
+ default:
250
+ console.log('\n请指定要运行的示例编号 (1-6)');
251
+ console.log('用法: ts-node src/demo/commander/02-命令系统.ts <示例编号> [命令] [选项]');
252
+ console.log('\n可用示例:');
253
+ console.log(' 1 - 基本子命令');
254
+ console.log(' 2 - 命令别名');
255
+ console.log(' 3 - 命令特定选项');
256
+ console.log(' 4 - 嵌套子命令');
257
+ console.log(' 5 - 默认命令和命令钩子');
258
+ console.log(' 6 - 命令参数验证');
259
+ }
260
+ }