@lppx/nlearn 1.1.8 → 1.1.9

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 (35) hide show
  1. package/dist/src/cli/cli.js +8 -3
  2. package/dist/src/demo/class/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +6 -0
  3. package/dist/src/demo/class/02-/347/273/247/346/211/277/344/270/216/345/244/232/346/200/201.js +6 -0
  4. package/dist/src/demo/class/03-/351/235/231/346/200/201/346/210/220/345/221/230/344/270/216/345/215/225/344/276/213.js +6 -0
  5. package/dist/src/demo/class/04-/346/216/245/345/217/243/344/270/216/345/256/236/347/216/260.js +7 -0
  6. package/dist/src/demo/commander/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +6 -0
  7. package/dist/src/demo/commander/02-/345/221/275/344/273/244/347/263/273/347/273/237.js +6 -0
  8. package/dist/src/demo/commander/03-/351/253/230/347/272/247/347/211/271/346/200/247.js +6 -0
  9. package/dist/src/demo/commander/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +4 -0
  10. package/dist/src/demo/esm/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +6 -0
  11. package/dist/src/demo/esm/02-/345/257/274/345/207/272/350/257/255/346/263/225.js +8 -0
  12. package/dist/src/demo/esm/03-/345/257/274/345/205/245/350/257/255/346/263/225.js +9 -2
  13. package/dist/src/demo/esm/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +8 -0
  14. package/dist/src/demo/fuse/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +5 -0
  15. package/dist/src/demo/fuse/02-/351/253/230/347/272/247/346/220/234/347/264/242.js +6 -0
  16. package/dist/src/demo/fuse/03-/351/205/215/347/275/256/350/257/246/350/247/243.js +6 -0
  17. package/dist/src/demo/fuse/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +5 -0
  18. package/dist/src/demo/inquirer/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +6 -0
  19. package/dist/src/demo/inquirer/02-/351/200/211/346/213/251/347/261/273/345/236/213.js +6 -0
  20. package/dist/src/demo/inquirer/03-/351/253/230/347/272/247/347/211/271/346/200/247.js +6 -0
  21. package/dist/src/demo/inquirer/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +5 -0
  22. package/dist/src/demo/promise-async/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +267 -0
  23. package/dist/src/demo/promise-async/02-/345/271/266/345/217/221/346/216/247/345/210/266.js +304 -0
  24. package/dist/src/demo/promise-async/03-/351/253/230/347/272/247/346/250/241/345/274/217.js +311 -0
  25. package/dist/src/demo/promise-async/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +349 -0
  26. package/dist/src/demo/prompts/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +5 -0
  27. package/dist/src/demo/prompts/02-/346/217/220/347/244/272/347/261/273/345/236/213.js +7 -0
  28. package/dist/src/demo/prompts/03-/351/253/230/347/272/247/347/211/271/346/200/247.js +6 -0
  29. package/dist/src/demo/prompts/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +4 -0
  30. package/dist/src/demo/prompts/05-/346/250/241/347/263/212/350/241/245/345/205/250.js +6 -0
  31. package/dist/src/demo/yargs/01-/345/237/272/347/241/200/346/246/202/345/277/265.js +5 -0
  32. package/dist/src/demo/yargs/02-/345/221/275/344/273/244/347/263/273/347/273/237.js +6 -0
  33. package/dist/src/demo/yargs/03-/351/253/230/347/272/247/347/211/271/346/200/247.js +6 -0
  34. package/dist/src/demo/yargs/04-/345/256/236/346/210/230/346/241/210/344/276/213.js +5 -0
  35. package/package.json +1 -1
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ /**
3
+ * Promise 与 async/await 实战案例
4
+ * ===============================
5
+ * 本文件展示 Promise 在实际项目中的应用场景
6
+ * 适用于 Node.js >= 14.0.0
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.batchProcessing = batchProcessing;
10
+ exports.requestDeduplication = requestDeduplication;
11
+ exports.cascadeDataLoading = cascadeDataLoading;
12
+ exports.timeoutAndCancellation = timeoutAndCancellation;
13
+ exports.errorRecovery = errorRecovery;
14
+ exports.dataPreloading = dataPreloading;
15
+ // #region 示例1: 批量数据处理
16
+ /**
17
+ * 批量处理数据,支持进度回调
18
+ */
19
+ async function batchProcessing() {
20
+ console.log('=== 批量数据处理 ===\n');
21
+ async function processBatch(items, processor, options) {
22
+ const { batchSize, onProgress } = options;
23
+ const results = [];
24
+ for (let i = 0; i < items.length; i += batchSize) {
25
+ const batch = items.slice(i, i + batchSize);
26
+ const batchResults = await Promise.all(batch.map(processor));
27
+ results.push(...batchResults);
28
+ if (onProgress) {
29
+ onProgress(Math.min(i + batchSize, items.length), items.length);
30
+ }
31
+ }
32
+ return results;
33
+ }
34
+ // 模拟处理单个项目
35
+ async function processItem(id) {
36
+ await new Promise((resolve) => setTimeout(resolve, 100));
37
+ return `处理完成: ${id}`;
38
+ }
39
+ const items = Array.from({ length: 20 }, (_, i) => i + 1);
40
+ console.log('开始批量处理 20 个项目(每批 5 个)\n');
41
+ const results = await processBatch(items, processItem, {
42
+ batchSize: 5,
43
+ onProgress: (current, total) => {
44
+ const percentage = ((current / total) * 100).toFixed(0);
45
+ console.log(`进度: ${current}/${total} (${percentage}%)`);
46
+ },
47
+ });
48
+ console.log(`\n完成!共处理 ${results.length} 个项目`);
49
+ }
50
+ // #endregion
51
+ // #region 示例2: API 请求去重
52
+ /**
53
+ * 防止重复的 API 请求
54
+ */
55
+ async function requestDeduplication() {
56
+ console.log('\n=== API 请求去重 ===\n');
57
+ class ApiClient {
58
+ constructor() {
59
+ this.pendingRequests = new Map();
60
+ }
61
+ async fetch(url) {
62
+ // 如果已有相同请求正在进行,直接返回该 Promise
63
+ if (this.pendingRequests.has(url)) {
64
+ console.log(`复用请求: ${url}`);
65
+ return this.pendingRequests.get(url);
66
+ }
67
+ console.log(`发起新请求: ${url}`);
68
+ const promise = this.performRequest(url);
69
+ this.pendingRequests.set(url, promise);
70
+ // 请求完成后清理
71
+ promise.finally(() => {
72
+ this.pendingRequests.delete(url);
73
+ });
74
+ return promise;
75
+ }
76
+ async performRequest(url) {
77
+ // 模拟网络请求
78
+ await new Promise((resolve) => setTimeout(resolve, 1000));
79
+ return { url, data: '响应数据' };
80
+ }
81
+ }
82
+ const client = new ApiClient();
83
+ console.log('同时发起 5 个相同的请求...\n');
84
+ const results = await Promise.all([
85
+ client.fetch('/api/user/1'),
86
+ client.fetch('/api/user/1'),
87
+ client.fetch('/api/user/1'),
88
+ client.fetch('/api/user/1'),
89
+ client.fetch('/api/user/1'),
90
+ ]);
91
+ console.log('\n所有请求完成');
92
+ console.log('注意:虽然发起了 5 次请求,但实际只执行了 1 次网络请求');
93
+ }
94
+ // #endregion
95
+ // #region 示例3: 级联数据加载
96
+ /**
97
+ * 加载有依赖关系的数据
98
+ */
99
+ async function cascadeDataLoading() {
100
+ console.log('\n=== 级联数据加载 ===\n');
101
+ // 模拟 API
102
+ async function fetchUser(userId) {
103
+ console.log(`获取用户 ${userId} 信息...`);
104
+ await new Promise((resolve) => setTimeout(resolve, 500));
105
+ return { id: userId, name: `用户${userId}`, departmentId: userId * 10 };
106
+ }
107
+ async function fetchDepartment(deptId) {
108
+ console.log(`获取部门 ${deptId} 信息...`);
109
+ await new Promise((resolve) => setTimeout(resolve, 500));
110
+ return { id: deptId, name: `部门${deptId}`, companyId: Math.floor(deptId / 10) };
111
+ }
112
+ async function fetchCompany(companyId) {
113
+ console.log(`获取公司 ${companyId} 信息...`);
114
+ await new Promise((resolve) => setTimeout(resolve, 500));
115
+ return { id: companyId, name: `公司${companyId}` };
116
+ }
117
+ // 方式 1: 串行加载(慢)
118
+ console.log('方式 1: 串行加载\n');
119
+ const startTime1 = Date.now();
120
+ const user = await fetchUser(1);
121
+ const department = await fetchDepartment(user.departmentId);
122
+ const company = await fetchCompany(department.companyId);
123
+ console.log(`\n串行加载耗时: ${Date.now() - startTime1}ms`);
124
+ console.log('结果:', { user, department, company });
125
+ // 方式 2: 优化加载(快)
126
+ console.log('\n\n方式 2: 优化加载(并行加载多个用户)\n');
127
+ const startTime2 = Date.now();
128
+ const users = await Promise.all([fetchUser(1), fetchUser(2), fetchUser(3)]);
129
+ const deptIds = [...new Set(users.map((u) => u.departmentId))];
130
+ const departments = await Promise.all(deptIds.map(fetchDepartment));
131
+ const companyIds = [...new Set(departments.map((d) => d.companyId))];
132
+ const companies = await Promise.all(companyIds.map(fetchCompany));
133
+ console.log(`\n优化加载耗时: ${Date.now() - startTime2}ms`);
134
+ console.log(`加载了 ${users.length} 个用户, ${departments.length} 个部门, ${companies.length} 个公司`);
135
+ }
136
+ // #endregion
137
+ // #region 示例4: 超时和取消
138
+ /**
139
+ * 实现请求超时和取消功能
140
+ */
141
+ async function timeoutAndCancellation() {
142
+ console.log('\n=== 超时和取消 ===\n');
143
+ class AbortablePromise {
144
+ constructor(executor) {
145
+ this.executor = executor;
146
+ this.aborted = false;
147
+ }
148
+ async run() {
149
+ return new Promise((resolve, reject) => {
150
+ this.executor(resolve, reject, { aborted: this.aborted });
151
+ });
152
+ }
153
+ abort() {
154
+ this.aborted = true;
155
+ }
156
+ }
157
+ // 示例:可取消的长时间操作
158
+ const operation = new AbortablePromise((resolve, reject, signal) => {
159
+ let count = 0;
160
+ const interval = setInterval(() => {
161
+ if (signal.aborted) {
162
+ clearInterval(interval);
163
+ reject(new Error('操作已取消'));
164
+ return;
165
+ }
166
+ count++;
167
+ console.log(`执行中... ${count}s`);
168
+ if (count >= 5) {
169
+ clearInterval(interval);
170
+ resolve('操作完成');
171
+ }
172
+ }, 1000);
173
+ });
174
+ // 2 秒后取消操作
175
+ setTimeout(() => {
176
+ console.log('\n取消操作!\n');
177
+ operation.abort();
178
+ }, 2500);
179
+ try {
180
+ const result = await operation.run();
181
+ console.log(result);
182
+ }
183
+ catch (error) {
184
+ if (error instanceof Error) {
185
+ console.log('错误:', error.message);
186
+ }
187
+ }
188
+ }
189
+ // #endregion
190
+ // #region 示例5: 错误恢复策略
191
+ /**
192
+ * 实现多种错误恢复策略
193
+ */
194
+ async function errorRecovery() {
195
+ console.log('\n=== 错误恢复策略 ===\n');
196
+ let attemptCount = 0;
197
+ async function unreliableApi() {
198
+ attemptCount++;
199
+ if (attemptCount <= 2) {
200
+ throw new Error('API 暂时不可用');
201
+ }
202
+ return 'API 响应';
203
+ }
204
+ // 策略 1: 重试
205
+ async function withRetry(fn, retries) {
206
+ for (let i = 0; i < retries; i++) {
207
+ try {
208
+ return await fn();
209
+ }
210
+ catch (error) {
211
+ if (i === retries - 1)
212
+ throw error;
213
+ console.log(`重试 ${i + 1}/${retries - 1}`);
214
+ }
215
+ }
216
+ throw new Error('不应该到达这里');
217
+ }
218
+ // 策略 2: 降级
219
+ async function withFallback(fn, fallback) {
220
+ try {
221
+ return await fn();
222
+ }
223
+ catch (error) {
224
+ console.log('使用降级方案');
225
+ return fallback;
226
+ }
227
+ }
228
+ // 策略 3: 断路器
229
+ class CircuitBreaker {
230
+ constructor() {
231
+ this.failures = 0;
232
+ this.threshold = 3;
233
+ this.state = 'closed';
234
+ }
235
+ async execute(fn) {
236
+ if (this.state === 'open') {
237
+ throw new Error('断路器已打开');
238
+ }
239
+ try {
240
+ const result = await fn();
241
+ this.failures = 0;
242
+ return result;
243
+ }
244
+ catch (error) {
245
+ this.failures++;
246
+ if (this.failures >= this.threshold) {
247
+ this.state = 'open';
248
+ console.log('断路器打开!');
249
+ }
250
+ throw error;
251
+ }
252
+ }
253
+ }
254
+ console.log('测试重试策略:\n');
255
+ attemptCount = 0;
256
+ const result1 = await withRetry(unreliableApi, 3);
257
+ console.log('结果:', result1);
258
+ console.log('\n测试降级策略:\n');
259
+ const result2 = await withFallback(async () => {
260
+ throw new Error('失败');
261
+ }, '默认值');
262
+ console.log('结果:', result2);
263
+ }
264
+ // #endregion
265
+ // #region 示例6: 数据预加载
266
+ /**
267
+ * 实现数据预加载和懒加载
268
+ */
269
+ async function dataPreloading() {
270
+ console.log('\n=== 数据预加载 ===\n');
271
+ class DataLoader {
272
+ constructor() {
273
+ this.cache = new Map();
274
+ this.loading = new Map();
275
+ }
276
+ async load(key, fetcher) {
277
+ // 从缓存返回
278
+ if (this.cache.has(key)) {
279
+ console.log(`从缓存加载: ${key}`);
280
+ return this.cache.get(key);
281
+ }
282
+ // 等待正在加载的请求
283
+ if (this.loading.has(key)) {
284
+ console.log(`等待加载中: ${key}`);
285
+ return this.loading.get(key);
286
+ }
287
+ // 开始新的加载
288
+ console.log(`开始加载: ${key}`);
289
+ const promise = fetcher();
290
+ this.loading.set(key, promise);
291
+ try {
292
+ const data = await promise;
293
+ this.cache.set(key, data);
294
+ return data;
295
+ }
296
+ finally {
297
+ this.loading.delete(key);
298
+ }
299
+ }
300
+ preload(key, fetcher) {
301
+ if (!this.cache.has(key) && !this.loading.has(key)) {
302
+ console.log(`预加载: ${key}`);
303
+ this.load(key, fetcher).catch(console.error);
304
+ }
305
+ }
306
+ }
307
+ const loader = new DataLoader();
308
+ // 预加载数据
309
+ loader.preload('data1', async () => {
310
+ await new Promise((resolve) => setTimeout(resolve, 1000));
311
+ return '数据 1';
312
+ });
313
+ console.log('预加载已启动,继续其他工作...\n');
314
+ await new Promise((resolve) => setTimeout(resolve, 500));
315
+ console.log('现在需要使用数据:\n');
316
+ const data = await loader.load('data1', async () => {
317
+ await new Promise((resolve) => setTimeout(resolve, 1000));
318
+ return '数据 1';
319
+ });
320
+ console.log('获取到:', data);
321
+ }
322
+ // #endregion
323
+ // 主函数:根据参数运行指定示例
324
+ if (require.main === module) {
325
+ const exampleNumber = process.argv[2];
326
+ const examples = {
327
+ '1': batchProcessing,
328
+ '2': requestDeduplication,
329
+ '3': cascadeDataLoading,
330
+ '4': timeoutAndCancellation,
331
+ '5': errorRecovery,
332
+ '6': dataPreloading,
333
+ };
334
+ if (exampleNumber && examples[exampleNumber]) {
335
+ console.log(`\n运行示例 ${exampleNumber}:\n`);
336
+ examples[exampleNumber]().catch(console.error);
337
+ }
338
+ else {
339
+ console.log('请指定要运行的示例编号 (1-6)');
340
+ console.log('例如: ts-node src/demo/promise-async/04-实战案例.ts 1');
341
+ console.log('\n可用示例:');
342
+ console.log('1 - 批量数据处理');
343
+ console.log('2 - API 请求去重');
344
+ console.log('3 - 级联数据加载');
345
+ console.log('4 - 超时和取消');
346
+ console.log('5 - 错误恢复策略');
347
+ console.log('6 - 数据预加载');
348
+ }
349
+ }
@@ -10,6 +10,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
10
10
  return (mod && mod.__esModule) ? mod : { "default": mod };
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.singlePrompt = singlePrompt;
14
+ exports.promptChain = promptChain;
15
+ exports.handleCancel = handleCancel;
16
+ exports.onSubmitCallback = onSubmitCallback;
17
+ exports.initialValues = initialValues;
13
18
  const prompts_1 = __importDefault(require("prompts"));
14
19
  // #region 示例1: 单个提示
15
20
  async function singlePrompt() {
@@ -9,6 +9,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.textTypes = textTypes;
13
+ exports.numberType = numberType;
14
+ exports.confirmType = confirmType;
15
+ exports.toggleType = toggleType;
16
+ exports.selectType = selectType;
17
+ exports.multiselectType = multiselectType;
18
+ exports.listType = listType;
12
19
  const prompts_1 = __importDefault(require("prompts"));
13
20
  // #region 示例1: 文本类型 (text, password, invisible)
14
21
  async function textTypes() {
@@ -8,6 +8,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
8
8
  return (mod && mod.__esModule) ? mod : { "default": mod };
9
9
  };
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.validation = validation;
12
+ exports.formatting = formatting;
13
+ exports.dynamicPrompts = dynamicPrompts;
14
+ exports.autocomplete = autocomplete;
15
+ exports.usePreviousAnswers = usePreviousAnswers;
16
+ exports.injectAnswers = injectAnswers;
11
17
  const prompts_1 = __importDefault(require("prompts"));
12
18
  // #region 示例1: 输入验证
13
19
  async function validation() {
@@ -8,6 +8,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
8
8
  return (mod && mod.__esModule) ? mod : { "default": mod };
9
9
  };
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.projectInitializer = projectInitializer;
12
+ exports.userRegistration = userRegistration;
13
+ exports.configGenerator = configGenerator;
14
+ exports.survey = survey;
11
15
  const prompts_1 = __importDefault(require("prompts"));
12
16
  // #region 示例1: 项目初始化工具
13
17
  async function projectInitializer() {
@@ -9,6 +9,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.basicFuzzySearch = basicFuzzySearch;
13
+ exports.multiFieldSearch = multiFieldSearch;
14
+ exports.pinyinSearch = pinyinSearch;
15
+ exports.advancedConfiguration = advancedConfiguration;
16
+ exports.dynamicDataSource = dynamicDataSource;
17
+ exports.multiSelectFuzzySearch = multiSelectFuzzySearch;
12
18
  const prompts_1 = __importDefault(require("prompts"));
13
19
  const fuse_js_1 = __importDefault(require("fuse.js"));
14
20
  // #region 示例1: 基础模糊搜索
@@ -9,6 +9,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.demoSimpleArgumentParsing = demoSimpleArgumentParsing;
13
+ exports.demoOptionTypes = demoOptionTypes;
14
+ exports.demoBooleanOptions = demoBooleanOptions;
15
+ exports.demoArrayOptions = demoArrayOptions;
16
+ exports.demoHelpInfo = demoHelpInfo;
12
17
  const yargs_1 = __importDefault(require("yargs"));
13
18
  const helpers_1 = require("yargs/helpers");
14
19
  // #region 示例1: 最简单的参数解析
@@ -9,6 +9,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.demoBasicCommand = demoBasicCommand;
13
+ exports.demoMultipleCommands = demoMultipleCommands;
14
+ exports.demoPositionalArguments = demoPositionalArguments;
15
+ exports.demoOptionalPositionalArgs = demoOptionalPositionalArgs;
16
+ exports.demoSubcommands = demoSubcommands;
17
+ exports.demoCommandAliases = demoCommandAliases;
12
18
  const yargs_1 = __importDefault(require("yargs"));
13
19
  const helpers_1 = require("yargs/helpers");
14
20
  // #region 示例1: 基础命令定义
@@ -9,6 +9,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.demoArgumentValidation = demoArgumentValidation;
13
+ exports.demoArgumentConflicts = demoArgumentConflicts;
14
+ exports.demoArgumentDependencies = demoArgumentDependencies;
15
+ exports.demoMiddleware = demoMiddleware;
16
+ exports.demoOptionGrouping = demoOptionGrouping;
17
+ exports.demoEnvironmentVariables = demoEnvironmentVariables;
12
18
  const yargs_1 = __importDefault(require("yargs"));
13
19
  const helpers_1 = require("yargs/helpers");
14
20
  // #region 示例1: 参数验证
@@ -9,6 +9,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.demoFileManagerTool = demoFileManagerTool;
13
+ exports.demoDatabaseMigrationTool = demoDatabaseMigrationTool;
14
+ exports.demoProjectScaffolder = demoProjectScaffolder;
15
+ exports.demoDeploymentTool = demoDeploymentTool;
16
+ exports.demoCompleteTaskManager = demoCompleteTaskManager;
12
17
  const yargs_1 = __importDefault(require("yargs"));
13
18
  const helpers_1 = require("yargs/helpers");
14
19
  // #region 示例1: 文件管理工具
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.1.8",
6
+ "version": "1.1.9",
7
7
  "description": "一个nodejs学习工具",
8
8
  "bin": {
9
9
  "nlearn": "dist/src/cli/index.js",