@daimazun/hardware-info 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 (47) hide show
  1. package/README.md +907 -0
  2. package/bin/OpenHardwareMonitorLib.dll +0 -0
  3. package/index.js +192 -0
  4. package/lib/allhardware.js +35 -0
  5. package/lib/backend-usage.js +103 -0
  6. package/lib/battery.js +76 -0
  7. package/lib/disk-watcher.js +156 -0
  8. package/lib/disk.js +77 -0
  9. package/lib/gpu.js +70 -0
  10. package/lib/hardware-service.js +284 -0
  11. package/lib/memory.js +59 -0
  12. package/lib/monitor.js +176 -0
  13. package/lib/network.js +75 -0
  14. package/lib/ohm-daemon.js +208 -0
  15. package/lib/ohm.js +41 -0
  16. package/lib/perfctr.js +43 -0
  17. package/lib/process-icon.js +76 -0
  18. package/lib/process-ops.js +218 -0
  19. package/lib/processes.js +232 -0
  20. package/lib/ps.js +93 -0
  21. package/lib/public-ip.js +124 -0
  22. package/lib/services.js +43 -0
  23. package/lib/sysinfo-daemon.js +188 -0
  24. package/lib/system.js +77 -0
  25. package/lib/usb.js +49 -0
  26. package/lib/win32-procs.js +241 -0
  27. package/package.json +50 -0
  28. package/scripts/get-all-hardware.ps1 +98 -0
  29. package/scripts/get-lhm-temp.ps1 +119 -0
  30. package/scripts/ohm-daemon.ps1 +141 -0
  31. package/scripts/sysinfo-daemon.ps1 +386 -0
  32. package/test/check-bugs.js +182 -0
  33. package/test/public/gj.pay.ali.jpg +0 -0
  34. package/test/public/gj.pay.wx.jpg +0 -0
  35. package/test/public/index.html +996 -0
  36. package/test/public/zdl.pay.ali.jpg +0 -0
  37. package/test/public/zdl.pay.wx.jpg +0 -0
  38. package/test/scan-encoding.js +77 -0
  39. package/test/server.js +255 -0
  40. package/test/test-all.js +180 -0
  41. package/test/test-daemon.js +51 -0
  42. package/test/test-kill-name.js +30 -0
  43. package/test/test-monitor.js +78 -0
  44. package/test/test-new-features.js +93 -0
  45. package/test/test-service.js +91 -0
  46. package/test/test-sysinfo-daemon.js +95 -0
  47. package/test/test.js +63 -0
@@ -0,0 +1,182 @@
1
+ /**
2
+ * 前端页面 bug 自动检查
3
+ * 1. 模板里 {{ }} 和 v-* 引用的变量/函数是否在 setup 里声明
4
+ * 2. 是否在 return 里导出
5
+ * 3. API 接口是否在 server.js 里存在
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+
11
+ const html = fs.readFileSync(path.join(__dirname, 'public/index.html'), 'utf8');
12
+ const serverJs = fs.readFileSync(path.join(__dirname, 'server.js'), 'utf8');
13
+
14
+ // 提取 setup 函数内容
15
+ const setupMatch = html.match(/setup\(\)\s*\{([\s\S]*?)return\s*\{([\s\S]*?)\n\s*\};/);
16
+ if (!setupMatch) {
17
+ console.log('未找到 setup 函数');
18
+ process.exit(1);
19
+ }
20
+
21
+ const setupBody = setupMatch[1];
22
+ const returnBody = setupMatch[2];
23
+
24
+ // 提取 setup 里声明的所有变量(const xxx = ref/reactive/computed/[]/{}/function)
25
+ const declaredVars = new Set();
26
+ const declPatterns = [
27
+ /const\s+(\w+)\s*=\s*(?:ref|reactive|computed)/g,
28
+ /const\s+(\w+)\s*=\s*(?:\[\]|\{\}|function|async|new)/g,
29
+ /(?:async\s+)?function\s+(\w+)\s*\(/g,
30
+ /const\s+(\w+)\s*=\s*\(/g, // 箭头函数
31
+ ];
32
+ for (const pattern of declPatterns) {
33
+ let m;
34
+ while ((m = pattern.exec(setupBody)) !== null) {
35
+ declaredVars.add(m[1]);
36
+ }
37
+ }
38
+
39
+ // 提取 return 里导出的变量
40
+ const exportedVars = new Set();
41
+ const returnPattern = /(\w+)\s*[,\n}]/g;
42
+ let rm;
43
+ while ((rm = returnPattern.exec(returnBody)) !== null) {
44
+ if (rm[1] !== 'get' && rm[1] !== 'return') {
45
+ exportedVars.add(rm[1]);
46
+ }
47
+ }
48
+
49
+ // 提取模板里引用的所有变量({{ }} 和 v-xxx="..." 和 @click="..." 和 :prop="...")
50
+ const templateMatch = html.match(/<div id="app">([\s\S]*?)<\/div>\s*<script>/);
51
+ const template = templateMatch ? templateMatch[1] : '';
52
+
53
+ const templateVars = new Set();
54
+
55
+ // {{ variable }} 引用
56
+ const mustachePattern = /\{\{\s*([a-zA-Z_$][\w$]*)/g;
57
+ let mm;
58
+ while ((mm = mustachePattern.exec(template)) !== null) {
59
+ templateVars.add(mm[1]);
60
+ }
61
+
62
+ // v-if/v-for/v-show/v-model/v-bind 引用
63
+ const vPattern = /v-(?:if|for|show|model|bind|html|text|on|cloak|pre|once|memo|is)[^=]*="([^"]*)"/g;
64
+ let vm;
65
+ while ((vm = vPattern.exec(template)) !== null) {
66
+ const expr = vm[1];
67
+ // 提取表达式里的变量名
68
+ const varPattern = /([a-zA-Z_$][\w$]*)\s*(?:\(|\.|\[|==|!=|>|<|>=|<=|&&|\|\||\?|\+|-|\*|\/|%|,|$)/g;
69
+ let vv;
70
+ while ((vv = varPattern.exec(expr)) !== null) {
71
+ templateVars.add(vv[1]);
72
+ }
73
+ }
74
+
75
+ // @click/@xxx 事件引用
76
+ const eventPattern = /@(?:click|change|input|submit|mouseenter|mouseleave|keydown|keyup|focus|blur)[^=]*="([^"]*)"/g;
77
+ let em;
78
+ while ((em = eventPattern.exec(template)) !== null) {
79
+ const expr = em[1];
80
+ const funcPattern = /([a-zA-Z_$][\w$]*)\s*\(/g;
81
+ let fm;
82
+ while ((fm = funcPattern.exec(expr)) !== null) {
83
+ templateVars.add(fm[1]);
84
+ }
85
+ }
86
+
87
+ // :prop 简写引用
88
+ const colonPattern = /:([a-zA-Z-]+)="([^"]*)"/g;
89
+ let cm;
90
+ while ((cm = colonPattern.exec(template)) !== null) {
91
+ const expr = cm[2];
92
+ const varPattern = /([a-zA-Z_$][\w$]*)\s*(?:\(|\.|\[|==|!=|>|<|>=|<=|&&|\|\||\?|\+|-|\*|\/|%|,|$)/g;
93
+ let vv;
94
+ while ((vv = varPattern.exec(expr)) !== null) {
95
+ templateVars.add(vv[1]);
96
+ }
97
+ }
98
+
99
+ // v-for 里的 (item, index) 是局部变量,排除
100
+ const vforPattern = /v-for="\((\w+)(?:\s*,\s*(\w+))?\)\s+in/g;
101
+ let vfm;
102
+ const vforLocals = new Set();
103
+ while ((vfm = vforPattern.exec(template)) !== null) {
104
+ vforLocals.add(vfm[1]);
105
+ if (vfm[2]) vforLocals.add(vfm[2]);
106
+ }
107
+
108
+ // 排除 JS 内置关键字和 Vue 内置
109
+ const builtins = new Set([
110
+ 'true', 'false', 'null', 'undefined', 'Math', 'Date', 'JSON', 'Array', 'Object',
111
+ 'String', 'Number', 'Boolean', 'parseInt', 'parseFloat', 'isNaN', 'isFinite',
112
+ 'console', 'window', 'document', 'alert', 'confirm', 'prompt', 'setTimeout', 'setInterval',
113
+ 'item', 'index', 'key', 'value', 's', 'c', 'p', 'd', 'h', 'inst', 'pd', 'svc',
114
+ 't', 'e', 'i', 'n', 'a', 'b', 'k', 'v', 'm', 'r', 'x', 'y', 'z',
115
+ 'this', 'new', 'typeof', 'instanceof', 'in', 'of', 'void', 'delete',
116
+ 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue',
117
+ 'return', 'function', 'class', 'extends', 'super', 'const', 'let', 'var',
118
+ 'try', 'catch', 'finally', 'throw', 'async', 'await', 'yield',
119
+ 'import', 'export', 'from', 'default', 'require', 'module',
120
+ 'Vue', 'ref', 'reactive', 'computed', 'onMounted', 'onUnmounted', 'watch',
121
+ 'length', 'push', 'pop', 'shift', 'unshift', 'slice', 'splice', 'join',
122
+ 'map', 'filter', 'reduce', 'forEach', 'find', 'findIndex', 'some', 'every',
123
+ 'includes', 'indexOf', 'lastIndexOf', 'sort', 'reverse', 'concat',
124
+ 'toString', 'toFixed', 'toLocaleString', 'toLowerCase', 'toUpperCase',
125
+ 'trim', 'split', 'substring', 'substr', 'slice', 'replace', 'match', 'test',
126
+ 'getFullYear', 'getMonth', 'getDate', 'getHours', 'getMinutes', 'getSeconds',
127
+ 'stringify', 'parse',
128
+ ]);
129
+
130
+ // 检查结果
131
+ console.log('=== 前端页面 Bug 检查 ===\n');
132
+
133
+ // 1. 模板引用但未声明的变量
134
+ const undeclared = [...templateVars].filter(v =>
135
+ !declaredVars.has(v) && !builtins.has(v) && !vforLocals.has(v) && !v.startsWith('on')
136
+ );
137
+ console.log(`1. 模板引用但 setup 未声明的变量/函数 (${undeclared.length}个):`);
138
+ undeclared.forEach(v => console.log(` - ${v}`));
139
+ if (undeclared.length === 0) console.log(' (无)');
140
+
141
+ // 2. 声明了但未导出的变量
142
+ const notExported = [...declaredVars].filter(v =>
143
+ !exportedVars.has(v) && !builtins.has(v) && templateVars.has(v)
144
+ );
145
+ console.log(`\n2. 模板引用但未在 return 导出的变量 (${notExported.length}个):`);
146
+ notExported.forEach(v => console.log(` - ${v}`));
147
+ if (notExported.length === 0) console.log(' (无)');
148
+
149
+ // 3. 导出了但未声明的变量(拼写错误)
150
+ const exportedButUndeclared = [...exportedVars].filter(v =>
151
+ !declaredVars.has(v) && !builtins.has(v)
152
+ );
153
+ console.log(`\n3. return 导出但 setup 未声明的变量 (${exportedButUndeclared.length}个):`);
154
+ exportedButUndeclared.forEach(v => console.log(` - ${v}`));
155
+ if (exportedButUndeclared.length === 0) console.log(' (无)');
156
+
157
+ // 4. 检查 API 接口
158
+ console.log('\n4. 前端 fetch 的 API 接口检查:');
159
+ const apiPattern = /fetch\(['"`](\/api\/[\w-\/]+)['"`]/g;
160
+ let am;
161
+ const apis = new Set();
162
+ while ((am = apiPattern.exec(html)) !== null) {
163
+ apis.add(am[1]);
164
+ }
165
+ let apiIssues = 0;
166
+ apis.forEach(api => {
167
+ // 去掉查询参数
168
+ const baseApi = api.split('?')[0];
169
+ if (!serverJs.includes(baseApi) && !serverJs.includes(baseApi.replace('/api/', ''))) {
170
+ console.log(` - 缺失: ${api}`);
171
+ apiIssues++;
172
+ }
173
+ });
174
+ if (apiIssues === 0) console.log(' (全部存在)');
175
+
176
+ // 5. 统计
177
+ console.log('\n=== 统计 ===');
178
+ console.log(`模板引用变量: ${templateVars.size}个`);
179
+ console.log(`setup 声明变量: ${declaredVars.size}个`);
180
+ console.log(`return 导出变量: ${exportedVars.size}个`);
181
+ console.log(`API 接口: ${apis.size}个`);
182
+ console.log(`\n问题总数: ${undeclared.length + notExported.length + exportedButUndeclared.length + apiIssues}`);
Binary file
Binary file