zen-gitsync 2.11.39 → 2.12.3

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 (58) hide show
  1. package/LICENSE +190 -21
  2. package/README.md +695 -695
  3. package/index.js +25 -11
  4. package/package.json +2 -2
  5. package/scripts/convert-colors-to-vars.cjs +286 -272
  6. package/scripts/convert-fontsize-to-vars.cjs +221 -207
  7. package/scripts/convert-spacing-to-vars.cjs +256 -242
  8. package/scripts/convert-to-standard-vars.cjs +282 -268
  9. package/scripts/release.js +599 -585
  10. package/src/config.js +350 -336
  11. package/src/gitCommit.js +455 -440
  12. package/src/ui/public/assets/EditorView-CbqSI9nw.css +1 -0
  13. package/src/ui/public/assets/EditorView-GS5cmh99.js +21 -0
  14. package/src/ui/public/assets/SourceMapView-DyMK80hS.css +1 -0
  15. package/src/ui/public/assets/SourceMapView-_YRtzmZZ.js +3 -0
  16. package/src/ui/public/assets/index-ML5Y-5lO.css +1 -0
  17. package/src/ui/public/assets/index-yky0Sd13.js +73 -0
  18. package/src/ui/public/assets/{ts.worker-Dth06zuC.js → ts.worker-METxwbDZ.js} +1 -16
  19. package/src/ui/public/assets/{vendor-B1T2uxYO.js → vendor-DITsiaGj.js} +294 -287
  20. package/src/ui/public/assets/vendor-q83wvJns.css +1 -0
  21. package/src/ui/public/index.html +4 -4
  22. package/src/ui/server/.claude/codediff.txt +6 -0
  23. package/src/ui/server/index.js +410 -396
  24. package/src/ui/server/middleware/requestLogger.js +51 -37
  25. package/src/ui/server/routes/branchStatus.js +101 -87
  26. package/src/ui/server/routes/code.js +110 -96
  27. package/src/ui/server/routes/codeAnalysis.js +995 -981
  28. package/src/ui/server/routes/config.js +1172 -1158
  29. package/src/ui/server/routes/exec.js +272 -258
  30. package/src/ui/server/routes/fileOpen.js +279 -265
  31. package/src/ui/server/routes/fs.js +701 -699
  32. package/src/ui/server/routes/git/diff.js +352 -338
  33. package/src/ui/server/routes/git/diffUtils.js +128 -114
  34. package/src/ui/server/routes/git/stash.js +552 -538
  35. package/src/ui/server/routes/git/tags.js +172 -158
  36. package/src/ui/server/routes/git.js +190 -176
  37. package/src/ui/server/routes/gitOps.js +1179 -1165
  38. package/src/ui/server/routes/instances.js +38 -24
  39. package/src/ui/server/routes/npm.js +1023 -1009
  40. package/src/ui/server/routes/process.js +82 -68
  41. package/src/ui/server/routes/status.js +67 -53
  42. package/src/ui/server/routes/terminal.js +319 -305
  43. package/src/ui/server/socket/registerUiSocketHandlers.js +226 -212
  44. package/src/ui/server/utils/createSavePortToFile.js +46 -32
  45. package/src/ui/server/utils/instanceRegistry.js +270 -256
  46. package/src/ui/server/utils/pathGuard.js +155 -0
  47. package/src/ui/server/utils/pathGuard.test.js +138 -0
  48. package/src/ui/server/utils/randomStartPort.js +51 -37
  49. package/src/ui/server/utils/startServerOnAvailablePort.js +101 -87
  50. package/src/utils/index.js +1058 -1044
  51. package/src/ui/public/assets/devopicons-QN4QXivI.woff2 +0 -0
  52. package/src/ui/public/assets/file-icons-C0jOugUK.woff2 +0 -0
  53. package/src/ui/public/assets/fontawesome-B-jkhYfk.woff2 +0 -0
  54. package/src/ui/public/assets/index-BvVl-092.js +0 -95
  55. package/src/ui/public/assets/index-DXO3Lvqi.css +0 -1
  56. package/src/ui/public/assets/mfixx-CpAhKOZz.woff2 +0 -0
  57. package/src/ui/public/assets/octicons-CaZ_fok2.woff2 +0 -0
  58. package/src/ui/public/assets/vendor-hOO_r_AU.css +0 -1
@@ -1,207 +1,221 @@
1
- /**
2
- * 将项目中硬编码的 font-size 值转换为 CSS 变量
3
- *
4
- * 根据 variables.scss 中定义的字体大小变量进行映射
5
- *
6
- * 使用方式:
7
- * node scripts/convert-fontsize-to-vars.cjs [--dry-run]
8
- *
9
- * --dry-run: 预览模式,不实际修改文件
10
- */
11
-
12
- const fs = require('fs');
13
- const path = require('path');
14
-
15
- // 获取命令行参数
16
- const args = process.argv.slice(2);
17
- const isDryRun = args.includes('--dry-run');
18
-
19
- // 字体大小映射表(基于 variables.scss)
20
- const FONT_SIZE_MAP = {
21
- '10px': 'var(--font-size-xs)',
22
- '12px': 'var(--font-size-sm)',
23
- '13px': 'var(--font-size-sm)', // 13px 映射到 sm (12px)
24
- '14px': 'var(--font-size-base)',
25
- '15px': 'var(--font-size-base)', // 15px 映射到 base (14px)
26
- '16px': 'var(--font-size-md)',
27
- '18px': 'var(--font-size-lg)',
28
- '20px': 'var(--font-size-xl)',
29
- '22px': 'var(--font-size-2xl)',
30
- '24px': 'var(--font-size-3xl)',
31
-
32
- // rem 单位映射
33
- '0.625rem': 'var(--font-size-xs)', // 10px
34
- '0.75rem': 'var(--font-size-sm)', // 12px
35
- '0.875rem': 'var(--font-size-base)', // 14px
36
- '1rem': 'var(--font-size-md)', // 16px
37
- '1.125rem': 'var(--font-size-lg)', // 18px
38
- '1.25rem': 'var(--font-size-xl)', // 20px
39
- '1.375rem': 'var(--font-size-2xl)', // 22px
40
- '1.5rem': 'var(--font-size-3xl)', // 24px
41
- };
42
-
43
- // 需要处理的文件扩展名
44
- const TARGET_EXTENSIONS = ['.vue', '.scss', '.css'];
45
-
46
- // 需要跳过的文件
47
- const SKIP_FILES = ['variables.scss', 'dark-theme.scss'];
48
-
49
- // 统计信息
50
- let stats = {
51
- totalFiles: 0,
52
- modifiedFiles: 0,
53
- totalReplacements: 0,
54
- replacementDetails: {},
55
- skippedSizes: new Set(),
56
- };
57
-
58
- console.log(`\n运行模式: ${isDryRun ? '预览模式(不会修改文件)' : '修改模式'}\n`);
59
-
60
- /**
61
- * 递归扫描目录
62
- */
63
- function scanDirectory(dir, fileList = []) {
64
- const files = fs.readdirSync(dir);
65
-
66
- files.forEach(file => {
67
- const filePath = path.join(dir, file);
68
- const stat = fs.statSync(filePath);
69
-
70
- if (stat.isDirectory()) {
71
- if (file !== 'node_modules' && file !== '.git' && file !== 'dist') {
72
- scanDirectory(filePath, fileList);
73
- }
74
- } else {
75
- const ext = path.extname(file);
76
- if (TARGET_EXTENSIONS.includes(ext) && !SKIP_FILES.includes(file)) {
77
- fileList.push(filePath);
78
- }
79
- }
80
- });
81
-
82
- return fileList;
83
- }
84
-
85
- /**
86
- * 处理文件内容
87
- */
88
- function processFileContent(content, filePath) {
89
- let modified = false;
90
- let newContent = content;
91
-
92
- // 匹配 font-size 属性
93
- // 支持 px 和 rem 单位
94
- const fontSizeRegex = /(\bfont-size\s*:\s*)(\d+(?:\.\d+)?(?:px|rem))\b/g;
95
-
96
- newContent = newContent.replace(fontSizeRegex, (match, prefix, value) => {
97
- const mappedVar = FONT_SIZE_MAP[value];
98
-
99
- if (mappedVar && mappedVar !== value) {
100
- // 记录替换
101
- stats.replacementDetails[value] = (stats.replacementDetails[value] || 0) + 1;
102
- stats.totalReplacements++;
103
- modified = true;
104
- return prefix + mappedVar;
105
- } else if (!mappedVar) {
106
- // 记录未映射的字体大小
107
- stats.skippedSizes.add(value);
108
- }
109
-
110
- return match;
111
- });
112
-
113
- return { content: newContent, modified };
114
- }
115
-
116
- /**
117
- * 处理单个文件
118
- */
119
- function processFile(filePath) {
120
- try {
121
- const content = fs.readFileSync(filePath, 'utf8');
122
- const { content: newContent, modified } = processFileContent(content, filePath);
123
-
124
- if (modified) {
125
- if (!isDryRun) {
126
- fs.writeFileSync(filePath, newContent, 'utf8');
127
- }
128
- stats.modifiedFiles++;
129
- console.log(`${isDryRun ? '📋 [预览]' : '✅'} ${filePath}`);
130
- return true;
131
- }
132
-
133
- return false;
134
- } catch (error) {
135
- console.error(`❌ 处理文件失败: ${filePath}`, error.message);
136
- return false;
137
- }
138
- }
139
-
140
- /**
141
- * 主函数
142
- */
143
- function main() {
144
- const projectRoot = path.join(__dirname, '..');
145
- const srcDir = path.join(projectRoot, 'src');
146
-
147
- console.log('🚀 开始扫描并转换 font-size 值...\n');
148
- console.log(`📁 项目根目录: ${projectRoot}`);
149
- console.log(`📁 扫描目录: ${srcDir}\n`);
150
-
151
- // 扫描所有目标文件
152
- const files = scanDirectory(srcDir);
153
- stats.totalFiles = files.length;
154
-
155
- console.log(`📊 找到 ${files.length} 个文件需要检查\n`);
156
- console.log('🔄 开始处理文件...\n');
157
-
158
- // 处理每个文件
159
- files.forEach(file => {
160
- processFile(file);
161
- });
162
-
163
- // 输出统计信息
164
- console.log('\n' + '='.repeat(60));
165
- console.log('📊 转换统计报告');
166
- console.log('='.repeat(60));
167
- console.log(`总文件数: ${stats.totalFiles}`);
168
- console.log(`修改文件数: ${stats.modifiedFiles}`);
169
- console.log(`总替换次数: ${stats.totalReplacements}`);
170
-
171
- if (Object.keys(stats.replacementDetails).length > 0) {
172
- console.log('\n📋 替换详情:');
173
- Object.entries(stats.replacementDetails)
174
- .sort((a, b) => b[1] - a[1])
175
- .forEach(([size, count]) => {
176
- const varName = FONT_SIZE_MAP[size];
177
- console.log(` font-size: ${size} => ${varName}: ${count} 次`);
178
- });
179
- }
180
-
181
- if (stats.skippedSizes.size > 0) {
182
- console.log('\n⚠️ 未映射的字体大小(需要手动检查):');
183
- Array.from(stats.skippedSizes)
184
- .sort()
185
- .forEach(size => {
186
- console.log(` ${size}`);
187
- });
188
- console.log('\n💡 建议:');
189
- console.log(' 1. 检查这些值是否是特殊尺寸,需要保留');
190
- console.log(' 2. 如果需要映射,可以将其添加到 FONT_SIZE_MAP 中');
191
- console.log(' 3. 或考虑调整为最接近的标准尺寸');
192
- }
193
-
194
- if (isDryRun) {
195
- console.log('\n💡 提示: 这是预览模式,文件未被修改');
196
- console.log(' 移除 --dry-run 参数以实际应用更改');
197
- } else {
198
- console.log('\n✨ 转换完成!');
199
- }
200
- }
201
-
202
- // 运行主函数
203
- if (require.main === module) {
204
- main();
205
- }
206
-
207
- module.exports = { processFileContent };
1
+ // Copyright 2026 xz333221
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+ /**
16
+ * 将项目中硬编码的 font-size 值转换为 CSS 变量
17
+ *
18
+ * 根据 variables.scss 中定义的字体大小变量进行映射
19
+ *
20
+ * 使用方式:
21
+ * node scripts/convert-fontsize-to-vars.cjs [--dry-run]
22
+ *
23
+ * --dry-run: 预览模式,不实际修改文件
24
+ */
25
+
26
+ const fs = require('fs');
27
+ const path = require('path');
28
+
29
+ // 获取命令行参数
30
+ const args = process.argv.slice(2);
31
+ const isDryRun = args.includes('--dry-run');
32
+
33
+ // 字体大小映射表(基于 variables.scss)
34
+ const FONT_SIZE_MAP = {
35
+ '10px': 'var(--font-size-xs)',
36
+ '12px': 'var(--font-size-sm)',
37
+ '13px': 'var(--font-size-sm)', // 13px 映射到 sm (12px)
38
+ '14px': 'var(--font-size-base)',
39
+ '15px': 'var(--font-size-base)', // 15px 映射到 base (14px)
40
+ '16px': 'var(--font-size-md)',
41
+ '18px': 'var(--font-size-lg)',
42
+ '20px': 'var(--font-size-xl)',
43
+ '22px': 'var(--font-size-2xl)',
44
+ '24px': 'var(--font-size-3xl)',
45
+
46
+ // rem 单位映射
47
+ '0.625rem': 'var(--font-size-xs)', // 10px
48
+ '0.75rem': 'var(--font-size-sm)', // 12px
49
+ '0.875rem': 'var(--font-size-base)', // 14px
50
+ '1rem': 'var(--font-size-md)', // 16px
51
+ '1.125rem': 'var(--font-size-lg)', // 18px
52
+ '1.25rem': 'var(--font-size-xl)', // 20px
53
+ '1.375rem': 'var(--font-size-2xl)', // 22px
54
+ '1.5rem': 'var(--font-size-3xl)', // 24px
55
+ };
56
+
57
+ // 需要处理的文件扩展名
58
+ const TARGET_EXTENSIONS = ['.vue', '.scss', '.css'];
59
+
60
+ // 需要跳过的文件
61
+ const SKIP_FILES = ['variables.scss', 'dark-theme.scss'];
62
+
63
+ // 统计信息
64
+ let stats = {
65
+ totalFiles: 0,
66
+ modifiedFiles: 0,
67
+ totalReplacements: 0,
68
+ replacementDetails: {},
69
+ skippedSizes: new Set(),
70
+ };
71
+
72
+ console.log(`\n运行模式: ${isDryRun ? '预览模式(不会修改文件)' : '修改模式'}\n`);
73
+
74
+ /**
75
+ * 递归扫描目录
76
+ */
77
+ function scanDirectory(dir, fileList = []) {
78
+ const files = fs.readdirSync(dir);
79
+
80
+ files.forEach(file => {
81
+ const filePath = path.join(dir, file);
82
+ const stat = fs.statSync(filePath);
83
+
84
+ if (stat.isDirectory()) {
85
+ if (file !== 'node_modules' && file !== '.git' && file !== 'dist') {
86
+ scanDirectory(filePath, fileList);
87
+ }
88
+ } else {
89
+ const ext = path.extname(file);
90
+ if (TARGET_EXTENSIONS.includes(ext) && !SKIP_FILES.includes(file)) {
91
+ fileList.push(filePath);
92
+ }
93
+ }
94
+ });
95
+
96
+ return fileList;
97
+ }
98
+
99
+ /**
100
+ * 处理文件内容
101
+ */
102
+ function processFileContent(content, filePath) {
103
+ let modified = false;
104
+ let newContent = content;
105
+
106
+ // 匹配 font-size 属性
107
+ // 支持 px 和 rem 单位
108
+ const fontSizeRegex = /(\bfont-size\s*:\s*)(\d+(?:\.\d+)?(?:px|rem))\b/g;
109
+
110
+ newContent = newContent.replace(fontSizeRegex, (match, prefix, value) => {
111
+ const mappedVar = FONT_SIZE_MAP[value];
112
+
113
+ if (mappedVar && mappedVar !== value) {
114
+ // 记录替换
115
+ stats.replacementDetails[value] = (stats.replacementDetails[value] || 0) + 1;
116
+ stats.totalReplacements++;
117
+ modified = true;
118
+ return prefix + mappedVar;
119
+ } else if (!mappedVar) {
120
+ // 记录未映射的字体大小
121
+ stats.skippedSizes.add(value);
122
+ }
123
+
124
+ return match;
125
+ });
126
+
127
+ return { content: newContent, modified };
128
+ }
129
+
130
+ /**
131
+ * 处理单个文件
132
+ */
133
+ function processFile(filePath) {
134
+ try {
135
+ const content = fs.readFileSync(filePath, 'utf8');
136
+ const { content: newContent, modified } = processFileContent(content, filePath);
137
+
138
+ if (modified) {
139
+ if (!isDryRun) {
140
+ fs.writeFileSync(filePath, newContent, 'utf8');
141
+ }
142
+ stats.modifiedFiles++;
143
+ console.log(`${isDryRun ? '📋 [预览]' : '✅'} ${filePath}`);
144
+ return true;
145
+ }
146
+
147
+ return false;
148
+ } catch (error) {
149
+ console.error(`❌ 处理文件失败: ${filePath}`, error.message);
150
+ return false;
151
+ }
152
+ }
153
+
154
+ /**
155
+ * 主函数
156
+ */
157
+ function main() {
158
+ const projectRoot = path.join(__dirname, '..');
159
+ const srcDir = path.join(projectRoot, 'src');
160
+
161
+ console.log('🚀 开始扫描并转换 font-size 值...\n');
162
+ console.log(`📁 项目根目录: ${projectRoot}`);
163
+ console.log(`📁 扫描目录: ${srcDir}\n`);
164
+
165
+ // 扫描所有目标文件
166
+ const files = scanDirectory(srcDir);
167
+ stats.totalFiles = files.length;
168
+
169
+ console.log(`📊 找到 ${files.length} 个文件需要检查\n`);
170
+ console.log('🔄 开始处理文件...\n');
171
+
172
+ // 处理每个文件
173
+ files.forEach(file => {
174
+ processFile(file);
175
+ });
176
+
177
+ // 输出统计信息
178
+ console.log('\n' + '='.repeat(60));
179
+ console.log('📊 转换统计报告');
180
+ console.log('='.repeat(60));
181
+ console.log(`总文件数: ${stats.totalFiles}`);
182
+ console.log(`修改文件数: ${stats.modifiedFiles}`);
183
+ console.log(`总替换次数: ${stats.totalReplacements}`);
184
+
185
+ if (Object.keys(stats.replacementDetails).length > 0) {
186
+ console.log('\n📋 替换详情:');
187
+ Object.entries(stats.replacementDetails)
188
+ .sort((a, b) => b[1] - a[1])
189
+ .forEach(([size, count]) => {
190
+ const varName = FONT_SIZE_MAP[size];
191
+ console.log(` font-size: ${size} => ${varName}: ${count} 次`);
192
+ });
193
+ }
194
+
195
+ if (stats.skippedSizes.size > 0) {
196
+ console.log('\n⚠️ 未映射的字体大小(需要手动检查):');
197
+ Array.from(stats.skippedSizes)
198
+ .sort()
199
+ .forEach(size => {
200
+ console.log(` ${size}`);
201
+ });
202
+ console.log('\n💡 建议:');
203
+ console.log(' 1. 检查这些值是否是特殊尺寸,需要保留');
204
+ console.log(' 2. 如果需要映射,可以将其添加到 FONT_SIZE_MAP 中');
205
+ console.log(' 3. 或考虑调整为最接近的标准尺寸');
206
+ }
207
+
208
+ if (isDryRun) {
209
+ console.log('\n💡 提示: 这是预览模式,文件未被修改');
210
+ console.log(' 移除 --dry-run 参数以实际应用更改');
211
+ } else {
212
+ console.log('\n✨ 转换完成!');
213
+ }
214
+ }
215
+
216
+ // 运行主函数
217
+ if (require.main === module) {
218
+ main();
219
+ }
220
+
221
+ module.exports = { processFileContent };