xw-devtool-cli 1.0.15 → 1.0.16

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  一个基于 Node.js 的开发者命令行工具箱,旨在提供开箱即用的常用开发工具,帮助开发者快速处理日常任务。
4
4
 
5
- 主要功能包括:Base64 编解码、图片格式转换、图片与 Base64 互转、Mock 数据生成、时间戳/日期格式化、时间计算、URL 编解码、UUID 生成、汉字转拼音、颜色转换、变量格式转换、哈希计算、二维码生成、特殊符号大全、Markdown 语法工具等。所有结果均自动复制到剪贴板,极大提升开发效率。
5
+ 主要功能包括:Base64 编解码、图片格式转换、图片与 Base64 互转、Mock 数据生成、时间戳/日期格式化、时间计算、URL 编解码、UUID 生成、汉字转拼音、颜色转换、变量格式转换、哈希计算、二维码生成、特殊符号大全、Markdown 语法工具、VS Code 代码段生成等。所有结果均自动复制到剪贴板,极大提升开发效率。
6
6
 
7
7
  ## ✨ 功能特性
8
8
 
@@ -31,6 +31,7 @@
31
31
  - **Emoji 输入**:支持分类查看和选择常用 Emoji,一键复制到剪贴板。
32
32
  - **HTML 实体工具**:支持 HTML 实体编码与解码 (如 `&` <-> `&amp;`)。
33
33
  - **Markdown 语法工具**:提供常用 Markdown 语法模板 (Headers, Lists, Tables, Code 等),一键复制。
34
+ - **VS Code 代码段生成器**:将代码转换为 VS Code Snippet JSON,自动生成语法速查表注释。
34
35
  - **占位图生成**:自定义尺寸、背景色、文字颜色和格式生成占位图。
35
36
  - **便捷操作**:
36
37
  - 支持文件选择对话框 (Windows)。
@@ -84,6 +85,7 @@ h. Mock Text
84
85
  i. Special Characters (Symbols)
85
86
  j. Emoji Picker
86
87
  k. Markdown Snippets
88
+ l. VS Code Snippet Generator
87
89
  0. Exit
88
90
  =================================
89
91
  ```
@@ -245,6 +247,16 @@ k. Markdown Snippets
245
247
  - **Others**: 引用、分割线、折叠详情等。
246
248
  - 选择对应语法后,模板将自动复制到剪贴板。
247
249
 
250
+ ### 21. VS Code 代码段生成器 (VS Code Snippet Generator)
251
+ - 选择 `l` 进入。
252
+ - **Generate Snippet**: 将任意代码转换为 VS Code 的 `.code-snippets` JSON 格式。
253
+ - 支持从 **剪贴板**、**文件** 或 **手动输入** 获取代码。
254
+ - 自动转义双引号和换行符,生成 `body` 数组。
255
+ - 输入 Snippet Name, Prefix (Trigger), Description。
256
+ - 结果自动复制到剪贴板,可直接粘贴到 VS Code 的 Snippet 配置文件中。
257
+ - **注意**:为防止长文本刷屏,结果**仅自动复制到剪贴板**,不会在终端打印。
258
+ - **提示**:生成的代码段会自动包含语法速查表 (Syntax Cheatsheet) 作为注释,方便参考。
259
+
248
260
  ## 📄 License
249
261
 
250
262
  ISC
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xw-devtool-cli",
3
- "version": "1.0.15",
3
+ "version": "1.0.16",
4
4
  "type": "module",
5
5
  "description": "基于node的开发者助手cli",
6
6
  "main": "index.js",
@@ -0,0 +1,95 @@
1
+ import inquirer from 'inquirer';
2
+ import { copy } from '../utils/clipboard.js';
3
+ import { selectFromMenu } from '../utils/menu.js';
4
+ import fs from 'fs';
5
+
6
+ export async function vscodeSnippetHandler() {
7
+ await generateSnippet();
8
+ }
9
+
10
+ async function generateSnippet() {
11
+ const inputSource = await selectFromMenu('VS Code Snippet Generator - Select Code Source', [
12
+ { name: 'Clipboard (Paste automatically)', value: 'clipboard' },
13
+ { name: 'Manual Input', value: 'manual' },
14
+ { name: 'File', value: 'file' }
15
+ ]);
16
+
17
+ let code = '';
18
+ if (inputSource === 'clipboard') {
19
+ const clipboardy = (await import('clipboardy')).default;
20
+ code = await clipboardy.read();
21
+ } else if (inputSource === 'file') {
22
+ const { filePath } = await inquirer.prompt([
23
+ {
24
+ type: 'input',
25
+ name: 'filePath',
26
+ message: 'Enter file path:'
27
+ }
28
+ ]);
29
+ try {
30
+ code = fs.readFileSync(filePath.replace(/"/g, ''), 'utf-8');
31
+ } catch (e) {
32
+ console.error('Error reading file:', e.message);
33
+ return;
34
+ }
35
+ } else {
36
+ const { manualInput } = await inquirer.prompt([
37
+ {
38
+ type: 'editor',
39
+ name: 'manualInput',
40
+ message: 'Enter/Paste your code (Close editor to finish):'
41
+ }
42
+ ]);
43
+ code = manualInput;
44
+ }
45
+
46
+ if (!code) {
47
+ console.log('No code provided.');
48
+ return;
49
+ }
50
+
51
+ const answers = await inquirer.prompt([
52
+ {
53
+ type: 'input',
54
+ name: 'name',
55
+ message: 'Snippet Name (e.g. "React Component"):',
56
+ validate: input => input ? true : 'Name is required'
57
+ },
58
+ {
59
+ type: 'input',
60
+ name: 'prefix',
61
+ message: 'Snippet Prefix (Trigger) (e.g. "rfc"):',
62
+ validate: input => input ? true : 'Prefix is required'
63
+ },
64
+ {
65
+ type: 'input',
66
+ name: 'description',
67
+ message: 'Description (optional):'
68
+ }
69
+ ]);
70
+
71
+ // Convert code to array of lines
72
+ const lines = code.split(/\r?\n/);
73
+
74
+ // We construct the object
75
+ const snippetObj = {
76
+ [answers.name]: {
77
+ prefix: answers.prefix,
78
+ body: lines,
79
+ description: answers.description || answers.name
80
+ }
81
+ };
82
+
83
+ const jsonOutput = JSON.stringify(snippetObj, null, 4);
84
+
85
+ // Add syntax cheatsheet as comments
86
+ const finalOutput = `// VS Code Snippet Syntax Help:
87
+ // 1. Tabstops: $1, $2... $0 (final cursor position)
88
+ // 2. Placeholders: \${1:default value}
89
+ // 3. Choices: \${1|one,two,three|}
90
+ // 4. Variables: $TM_FILENAME, $CURRENT_YEAR, $CLIPBOARD...
91
+
92
+ ${jsonOutput}`;
93
+
94
+ await copy(finalOutput);
95
+ }
package/src/index.js CHANGED
@@ -20,6 +20,7 @@ import { emojiHandler } from './commands/emoji.js';
20
20
  import { htmlEntitiesHandler } from './commands/htmlEntities.js';
21
21
  import { placeholderImgHandler } from './commands/placeholderImg.js';
22
22
  import { markdownHandler } from './commands/markdown.js';
23
+ import { vscodeSnippetHandler } from './commands/vscodeSnippet.js';
23
24
 
24
25
  process.on('SIGINT', () => {
25
26
  console.log('\nBye!');
@@ -63,7 +64,8 @@ const features = [
63
64
  { name: 'Mock Text', value: 'mock' },
64
65
  { name: 'Special Characters (Symbols)', value: 'specialChars' },
65
66
  { name: 'Emoji Picker', value: 'emoji' },
66
- { name: 'Markdown Snippets', value: 'markdown' }
67
+ { name: 'Markdown Snippets', value: 'markdown' },
68
+ { name: 'VS Code Snippet Generator', value: 'vscodeSnippet' }
67
69
  ];
68
70
 
69
71
  async function main() {
@@ -202,6 +204,9 @@ async function handleAction(action) {
202
204
  case 'markdown':
203
205
  await markdownHandler();
204
206
  break;
207
+ case 'vscodeSnippet':
208
+ await vscodeSnippetHandler();
209
+ break;
205
210
  default:
206
211
  console.log('Feature not implemented yet.');
207
212
  }