electrify-web 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 (129) hide show
  1. package/LICENSE.md +10 -0
  2. package/README.md +351 -0
  3. package/app/inject/_placeholder +0 -0
  4. package/app/lib/main.js +11772 -0
  5. package/app/lib/main.js.map +1 -0
  6. package/app/lib/preload.js +338 -0
  7. package/app/lib/preload.js.map +1 -0
  8. package/app/lib/static/login.css +57 -0
  9. package/app/lib/static/login.html +24 -0
  10. package/app/lib/static/login.js +10 -0
  11. package/app/nativefier.json +8 -0
  12. package/app/npm-shrinkwrap.json +1170 -0
  13. package/app/package.json +25 -0
  14. package/icon-scripts/convertToIcns +56 -0
  15. package/icon-scripts/convertToIco +39 -0
  16. package/icon-scripts/convertToIconset +68 -0
  17. package/icon-scripts/convertToPng +76 -0
  18. package/icon-scripts/convertToTrayIcon +32 -0
  19. package/lib/autologin/index.d.ts +25 -0
  20. package/lib/autologin/index.js +189 -0
  21. package/lib/autologin/index.js.map +1 -0
  22. package/lib/build/buildIcon.d.ts +6 -0
  23. package/lib/build/buildIcon.js +110 -0
  24. package/lib/build/buildIcon.js.map +1 -0
  25. package/lib/build/buildNativefierApp.d.ts +2 -0
  26. package/lib/build/buildNativefierApp.js +234 -0
  27. package/lib/build/buildNativefierApp.js.map +1 -0
  28. package/lib/build/prepareElectronApp.d.ts +15 -0
  29. package/lib/build/prepareElectronApp.js +220 -0
  30. package/lib/build/prepareElectronApp.js.map +1 -0
  31. package/lib/cli.d.ts +6 -0
  32. package/lib/cli.js +783 -0
  33. package/lib/cli.js.map +1 -0
  34. package/lib/config/index.d.ts +87 -0
  35. package/lib/config/index.js +460 -0
  36. package/lib/config/index.js.map +1 -0
  37. package/lib/constants.d.ts +11 -0
  38. package/lib/constants.js +58 -0
  39. package/lib/constants.js.map +1 -0
  40. package/lib/helpers/fsHelpers.d.ts +2 -0
  41. package/lib/helpers/fsHelpers.js +57 -0
  42. package/lib/helpers/fsHelpers.js.map +1 -0
  43. package/lib/helpers/helpers.d.ts +29 -0
  44. package/lib/helpers/helpers.js +225 -0
  45. package/lib/helpers/helpers.js.map +1 -0
  46. package/lib/helpers/iconShellHelpers.d.ts +5 -0
  47. package/lib/helpers/iconShellHelpers.js +91 -0
  48. package/lib/helpers/iconShellHelpers.js.map +1 -0
  49. package/lib/helpers/upgrade/executableHelpers.d.ts +2 -0
  50. package/lib/helpers/upgrade/executableHelpers.js +173 -0
  51. package/lib/helpers/upgrade/executableHelpers.js.map +1 -0
  52. package/lib/helpers/upgrade/plistInfoXMLHelpers.d.ts +2 -0
  53. package/lib/helpers/upgrade/plistInfoXMLHelpers.js +29 -0
  54. package/lib/helpers/upgrade/plistInfoXMLHelpers.js.map +1 -0
  55. package/lib/helpers/upgrade/rceditGet.d.ts +1 -0
  56. package/lib/helpers/upgrade/rceditGet.js +65 -0
  57. package/lib/helpers/upgrade/rceditGet.js.map +1 -0
  58. package/lib/helpers/upgrade/upgrade.d.ts +8 -0
  59. package/lib/helpers/upgrade/upgrade.js +193 -0
  60. package/lib/helpers/upgrade/upgrade.js.map +1 -0
  61. package/lib/infer/browsers/inferChromeVersion.d.ts +1 -0
  62. package/lib/infer/browsers/inferChromeVersion.js +73 -0
  63. package/lib/infer/browsers/inferChromeVersion.js.map +1 -0
  64. package/lib/infer/browsers/inferFirefoxVersion.d.ts +1 -0
  65. package/lib/infer/browsers/inferFirefoxVersion.js +61 -0
  66. package/lib/infer/browsers/inferFirefoxVersion.js.map +1 -0
  67. package/lib/infer/browsers/inferSafariVersion.d.ts +6 -0
  68. package/lib/infer/browsers/inferSafariVersion.js +96 -0
  69. package/lib/infer/browsers/inferSafariVersion.js.map +1 -0
  70. package/lib/infer/inferDefaults.d.ts +33 -0
  71. package/lib/infer/inferDefaults.js +272 -0
  72. package/lib/infer/inferDefaults.js.map +1 -0
  73. package/lib/infer/inferIcon.d.ts +1 -0
  74. package/lib/infer/inferIcon.js +116 -0
  75. package/lib/infer/inferIcon.js.map +1 -0
  76. package/lib/infer/inferOs.d.ts +4 -0
  77. package/lib/infer/inferOs.js +69 -0
  78. package/lib/infer/inferOs.js.map +1 -0
  79. package/lib/infer/inferTitle.d.ts +1 -0
  80. package/lib/infer/inferTitle.js +56 -0
  81. package/lib/infer/inferTitle.js.map +1 -0
  82. package/lib/integration-test.d.ts +1 -0
  83. package/lib/main.d.ts +11 -0
  84. package/lib/main.js +18 -0
  85. package/lib/main.js.map +1 -0
  86. package/lib/options/asyncConfig.d.ts +5 -0
  87. package/lib/options/asyncConfig.js +46 -0
  88. package/lib/options/asyncConfig.js.map +1 -0
  89. package/lib/options/fields/fields.d.ts +2 -0
  90. package/lib/options/fields/fields.js +32 -0
  91. package/lib/options/fields/fields.js.map +1 -0
  92. package/lib/options/fields/icon.d.ts +9 -0
  93. package/lib/options/fields/icon.js +106 -0
  94. package/lib/options/fields/icon.js.map +1 -0
  95. package/lib/options/fields/name.d.ts +9 -0
  96. package/lib/options/fields/name.js +59 -0
  97. package/lib/options/fields/name.js.map +1 -0
  98. package/lib/options/fields/userAgent.d.ts +10 -0
  99. package/lib/options/fields/userAgent.js +81 -0
  100. package/lib/options/fields/userAgent.js.map +1 -0
  101. package/lib/options/normalizeUrl.d.ts +1 -0
  102. package/lib/options/normalizeUrl.js +62 -0
  103. package/lib/options/normalizeUrl.js.map +1 -0
  104. package/lib/options/optionsMain.d.ts +6 -0
  105. package/lib/options/optionsMain.js +305 -0
  106. package/lib/options/optionsMain.js.map +1 -0
  107. package/lib/presets/index.d.ts +27 -0
  108. package/lib/presets/index.js +162 -0
  109. package/lib/presets/index.js.map +1 -0
  110. package/lib/pwa/index.d.ts +57 -0
  111. package/lib/pwa/index.js +241 -0
  112. package/lib/pwa/index.js.map +1 -0
  113. package/lib/security/index.d.ts +27 -0
  114. package/lib/security/index.js +202 -0
  115. package/lib/security/index.js.map +1 -0
  116. package/lib/updater/index.d.ts +34 -0
  117. package/lib/updater/index.js +264 -0
  118. package/lib/updater/index.js.map +1 -0
  119. package/lib/utils/parseUtils.d.ts +3 -0
  120. package/lib/utils/parseUtils.js +95 -0
  121. package/lib/utils/parseUtils.js.map +1 -0
  122. package/lib/utils/sanitizeFilename.d.ts +1 -0
  123. package/lib/utils/sanitizeFilename.js +53 -0
  124. package/lib/utils/sanitizeFilename.js.map +1 -0
  125. package/lib/wizard/index.d.ts +13 -0
  126. package/lib/wizard/index.js +252 -0
  127. package/lib/wizard/index.js.map +1 -0
  128. package/npm-shrinkwrap.json +8144 -0
  129. package/package.json +148 -0
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ /**
3
+ * PWA (Progressive Web App) 支持
4
+ * 解析 Web App Manifest,提取应用信息
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.fetchPWAInfo = fetchPWAInfo;
44
+ exports.getBestIconFromManifest = getBestIconFromManifest;
45
+ exports.pwaDisplayToOptions = pwaDisplayToOptions;
46
+ exports.pwaInfoToOptions = pwaInfoToOptions;
47
+ const axios_1 = __importDefault(require("axios"));
48
+ const log = __importStar(require("loglevel"));
49
+ /**
50
+ * 从 HTML 中提取属性值
51
+ */
52
+ function extractAttr(html, tagPattern, attr) {
53
+ const match = html.match(tagPattern);
54
+ if (match) {
55
+ const attrMatch = match[0].match(new RegExp(`${attr}=["']([^"']+)["']`, 'i'));
56
+ return attrMatch === null || attrMatch === void 0 ? void 0 : attrMatch[1];
57
+ }
58
+ return undefined;
59
+ }
60
+ /**
61
+ * 从 HTML 中提取 manifest 链接
62
+ */
63
+ function extractManifestUrl(html, baseUrl) {
64
+ const match = html.match(/<link[^>]*rel=["']manifest["'][^>]*>/i);
65
+ if (match) {
66
+ const href = extractAttr(match[0], /.*/, 'href');
67
+ if (href) {
68
+ try {
69
+ return new URL(href, baseUrl).href;
70
+ }
71
+ catch {
72
+ return undefined;
73
+ }
74
+ }
75
+ }
76
+ return undefined;
77
+ }
78
+ /**
79
+ * 从 HTML 中提取 PWA 相关信息
80
+ */
81
+ function extractPWAInfoFromHtml(html, baseUrl) {
82
+ const info = {};
83
+ // 主题色
84
+ const themeColorMatch = html.match(/<meta[^>]*name=["']theme-color["'][^>]*>/i);
85
+ if (themeColorMatch) {
86
+ info.themeColor = extractAttr(themeColorMatch[0], /.*/, 'content');
87
+ }
88
+ // Apple Touch Icon
89
+ const appleTouchMatch = html.match(/<link[^>]*rel=["']apple-touch-icon[^"']*["'][^>]*>/i);
90
+ if (appleTouchMatch) {
91
+ const href = extractAttr(appleTouchMatch[0], /.*/, 'href');
92
+ if (href) {
93
+ try {
94
+ info.appleTouchIcon = new URL(href, baseUrl).href;
95
+ }
96
+ catch { /* ignore */ }
97
+ }
98
+ }
99
+ // Favicon
100
+ const faviconMatch = html.match(/<link[^>]*rel=["'](?:shortcut )?icon["'][^>]*>/i);
101
+ if (faviconMatch) {
102
+ const href = extractAttr(faviconMatch[0], /.*/, 'href');
103
+ if (href) {
104
+ try {
105
+ info.favicon = new URL(href, baseUrl).href;
106
+ }
107
+ catch { /* ignore */ }
108
+ }
109
+ }
110
+ // 标题
111
+ const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
112
+ if (titleMatch) {
113
+ info.title = titleMatch[1].trim();
114
+ }
115
+ // 描述
116
+ const descMatch = html.match(/<meta[^>]*name=["']description["'][^>]*>/i);
117
+ if (descMatch) {
118
+ info.description = extractAttr(descMatch[0], /.*/, 'content');
119
+ }
120
+ return info;
121
+ }
122
+ /**
123
+ * 获取网站的 PWA 信息
124
+ */
125
+ async function fetchPWAInfo(url) {
126
+ const info = {};
127
+ try {
128
+ // 获取 HTML
129
+ const response = await axios_1.default.get(url, {
130
+ timeout: 10000,
131
+ headers: {
132
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
133
+ },
134
+ });
135
+ const html = response.data;
136
+ Object.assign(info, extractPWAInfoFromHtml(html, url));
137
+ // 查找并获取 manifest
138
+ const manifestUrl = extractManifestUrl(html, url);
139
+ if (manifestUrl) {
140
+ info.manifestUrl = manifestUrl;
141
+ try {
142
+ const manifestResponse = await axios_1.default.get(manifestUrl, { timeout: 5000 });
143
+ info.manifest = manifestResponse.data;
144
+ log.debug('Found PWA manifest:', manifestUrl);
145
+ }
146
+ catch (err) {
147
+ log.debug('Failed to fetch manifest:', err);
148
+ }
149
+ }
150
+ }
151
+ catch (err) {
152
+ log.debug('Failed to fetch PWA info:', err);
153
+ }
154
+ return info;
155
+ }
156
+ /**
157
+ * 从 PWA 信息中获取最佳图标 URL
158
+ */
159
+ function getBestIconFromManifest(manifest, baseUrl) {
160
+ if (!manifest.icons || manifest.icons.length === 0) {
161
+ return undefined;
162
+ }
163
+ // 按尺寸排序,优先选择大图标
164
+ const sortedIcons = [...manifest.icons].sort((a, b) => {
165
+ var _a, _b;
166
+ const sizeA = parseInt(((_a = a.sizes) === null || _a === void 0 ? void 0 : _a.split('x')[0]) || '0', 10);
167
+ const sizeB = parseInt(((_b = b.sizes) === null || _b === void 0 ? void 0 : _b.split('x')[0]) || '0', 10);
168
+ return sizeB - sizeA;
169
+ });
170
+ // 优先选择 purpose 为 any 或 maskable 的图标
171
+ const preferredIcon = sortedIcons.find((icon) => !icon.purpose || icon.purpose === 'any' || icon.purpose.includes('any')) || sortedIcons[0];
172
+ try {
173
+ return new URL(preferredIcon.src, baseUrl).href;
174
+ }
175
+ catch {
176
+ return preferredIcon.src;
177
+ }
178
+ }
179
+ /**
180
+ * 将 PWA manifest 的 display 模式转换为 Nativefier 选项
181
+ */
182
+ function pwaDisplayToOptions(display) {
183
+ switch (display) {
184
+ case 'fullscreen':
185
+ return { fullScreen: true };
186
+ case 'standalone':
187
+ return { hideWindowFrame: false };
188
+ case 'minimal-ui':
189
+ return { hideWindowFrame: false };
190
+ default:
191
+ return {};
192
+ }
193
+ }
194
+ /**
195
+ * 从 PWA 信息生成 Nativefier 选项建议
196
+ */
197
+ function pwaInfoToOptions(info, baseUrl) {
198
+ const options = {};
199
+ if (info.manifest) {
200
+ // 名称
201
+ if (info.manifest.short_name) {
202
+ options.name = info.manifest.short_name;
203
+ }
204
+ else if (info.manifest.name) {
205
+ options.name = info.manifest.name;
206
+ }
207
+ // 图标
208
+ const iconUrl = getBestIconFromManifest(info.manifest, baseUrl);
209
+ if (iconUrl) {
210
+ options.icon = iconUrl;
211
+ }
212
+ // 背景色
213
+ if (info.manifest.background_color) {
214
+ options.backgroundColor = info.manifest.background_color;
215
+ }
216
+ else if (info.manifest.theme_color) {
217
+ options.backgroundColor = info.manifest.theme_color;
218
+ }
219
+ // 显示模式
220
+ Object.assign(options, pwaDisplayToOptions(info.manifest.display));
221
+ }
222
+ // 如果 manifest 没有图标,使用 Apple Touch Icon 或 favicon
223
+ if (!options.icon) {
224
+ if (info.appleTouchIcon) {
225
+ options.icon = info.appleTouchIcon;
226
+ }
227
+ else if (info.favicon) {
228
+ options.icon = info.favicon;
229
+ }
230
+ }
231
+ // 如果没有名称,使用页面标题
232
+ if (!options.name && info.title) {
233
+ options.name = info.title;
234
+ }
235
+ // 如果没有背景色,使用主题色
236
+ if (!options.backgroundColor && info.themeColor) {
237
+ options.backgroundColor = info.themeColor;
238
+ }
239
+ return options;
240
+ }
241
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pwa/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 检查 Electron 版本安全性
3
+ */
4
+ export declare function checkElectronSecurity(version: string): {
5
+ safe: boolean;
6
+ vulnerabilities: string[];
7
+ recommendation?: string;
8
+ };
9
+ /**
10
+ * 获取最新 Electron 版本
11
+ */
12
+ export declare function getLatestElectronVersion(): Promise<string | undefined>;
13
+ /**
14
+ * 执行安全检查并输出警告
15
+ */
16
+ export declare function performSecurityCheck(electronVersion: string): Promise<void>;
17
+ /**
18
+ * doctor 命令 - 检查系统环境
19
+ */
20
+ export declare function runDoctor(): Promise<{
21
+ passed: boolean;
22
+ checks: Array<{
23
+ name: string;
24
+ status: 'pass' | 'warn' | 'fail';
25
+ message: string;
26
+ }>;
27
+ }>;
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.checkElectronSecurity = checkElectronSecurity;
40
+ exports.getLatestElectronVersion = getLatestElectronVersion;
41
+ exports.performSecurityCheck = performSecurityCheck;
42
+ exports.runDoctor = runDoctor;
43
+ const log = __importStar(require("loglevel"));
44
+ const axios_1 = __importDefault(require("axios"));
45
+ // 已知有严重漏洞的 Electron 版本 (CVE 数据)
46
+ const KNOWN_VULNERABLE_VERSIONS = {
47
+ // 格式: 'major.minor': ['CVE-xxxx-xxxx', ...]
48
+ '22.0': ['CVE-2023-4863'], // libwebp 漏洞
49
+ '22.1': ['CVE-2023-4863'],
50
+ '22.2': ['CVE-2023-4863'],
51
+ '22.3': ['CVE-2023-4863'],
52
+ '23.0': ['CVE-2023-4863'],
53
+ '23.1': ['CVE-2023-4863'],
54
+ '23.2': ['CVE-2023-4863'],
55
+ '24.0': ['CVE-2023-4863'],
56
+ '24.1': ['CVE-2023-4863'],
57
+ '24.2': ['CVE-2023-4863'],
58
+ '24.3': ['CVE-2023-4863'],
59
+ '24.4': ['CVE-2023-4863'],
60
+ '25.0': ['CVE-2023-4863'],
61
+ '25.1': ['CVE-2023-4863'],
62
+ '25.2': ['CVE-2023-4863'],
63
+ '25.3': ['CVE-2023-4863'],
64
+ '25.4': ['CVE-2023-4863'],
65
+ '25.5': ['CVE-2023-4863'],
66
+ '25.6': ['CVE-2023-4863'],
67
+ // 25.7.0+ 已修复
68
+ };
69
+ // 推荐的安全版本
70
+ const RECOMMENDED_VERSIONS = {
71
+ 25: '25.9.8',
72
+ 26: '26.6.10',
73
+ 27: '27.3.11',
74
+ 28: '28.3.3',
75
+ 29: '29.4.6',
76
+ 30: '30.5.1',
77
+ 31: '31.7.7',
78
+ 32: '32.2.7',
79
+ 33: '33.4.0',
80
+ };
81
+ /**
82
+ * 检查 Electron 版本安全性
83
+ */
84
+ function checkElectronSecurity(version) {
85
+ var _a;
86
+ const parts = version.split('.');
87
+ const major = parseInt(parts[0], 10);
88
+ const minor = parseInt(parts[1], 10);
89
+ const patch = parseInt(((_a = parts[2]) === null || _a === void 0 ? void 0 : _a.split('-')[0]) || '0', 10);
90
+ const majorMinor = `${major}.${minor}`;
91
+ const vulnerabilities = KNOWN_VULNERABLE_VERSIONS[majorMinor] || [];
92
+ const safe = vulnerabilities.length === 0;
93
+ let recommendation;
94
+ if (!safe && RECOMMENDED_VERSIONS[major]) {
95
+ recommendation = RECOMMENDED_VERSIONS[major];
96
+ }
97
+ return { safe, vulnerabilities, recommendation };
98
+ }
99
+ /**
100
+ * 获取最新 Electron 版本
101
+ */
102
+ async function getLatestElectronVersion() {
103
+ try {
104
+ const response = await axios_1.default.get('https://releases.electronjs.org/releases.json', { timeout: 5000 });
105
+ const stable = response.data.find((r) => !r.version.includes('-'));
106
+ return stable === null || stable === void 0 ? void 0 : stable.version;
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ /**
113
+ * 执行安全检查并输出警告
114
+ */
115
+ async function performSecurityCheck(electronVersion) {
116
+ const result = checkElectronSecurity(electronVersion);
117
+ if (!result.safe) {
118
+ log.warn('\n' + '⚠️'.repeat(20));
119
+ log.warn('🔴 SECURITY WARNING: Electron version has known vulnerabilities!');
120
+ log.warn(` Version: ${electronVersion}`);
121
+ log.warn(` CVEs: ${result.vulnerabilities.join(', ')}`);
122
+ if (result.recommendation) {
123
+ log.warn(` Recommended: ${result.recommendation}`);
124
+ log.warn(` Use: --electron-version ${result.recommendation}`);
125
+ }
126
+ log.warn('⚠️'.repeat(20) + '\n');
127
+ }
128
+ else {
129
+ log.debug(`✅ Electron ${electronVersion} has no known critical vulnerabilities`);
130
+ }
131
+ }
132
+ /**
133
+ * doctor 命令 - 检查系统环境
134
+ */
135
+ async function runDoctor() {
136
+ const checks = [];
137
+ // 1. Node.js 版本检查
138
+ const nodeVersion = process.version;
139
+ const nodeMajor = parseInt(nodeVersion.slice(1).split('.')[0], 10);
140
+ if (nodeMajor >= 18) {
141
+ checks.push({ name: 'Node.js', status: 'pass', message: `${nodeVersion} ✓` });
142
+ }
143
+ else if (nodeMajor >= 16) {
144
+ checks.push({ name: 'Node.js', status: 'warn', message: `${nodeVersion} (recommend 18+)` });
145
+ }
146
+ else {
147
+ checks.push({ name: 'Node.js', status: 'fail', message: `${nodeVersion} (requires 16+)` });
148
+ }
149
+ // 2. npm 版本检查
150
+ try {
151
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
152
+ const npmVersion = execSync('npm --version', { encoding: 'utf8' }).trim();
153
+ const npmMajor = parseInt(npmVersion.split('.')[0], 10);
154
+ if (npmMajor >= 7) {
155
+ checks.push({ name: 'npm', status: 'pass', message: `${npmVersion} ✓` });
156
+ }
157
+ else {
158
+ checks.push({ name: 'npm', status: 'warn', message: `${npmVersion} (recommend 7+)` });
159
+ }
160
+ }
161
+ catch {
162
+ checks.push({ name: 'npm', status: 'fail', message: 'not found' });
163
+ }
164
+ // 3. 平台检查
165
+ const platform = process.platform;
166
+ checks.push({ name: 'Platform', status: 'pass', message: `${platform} (${process.arch})` });
167
+ // 4. 磁盘空间检查 (简单检查)
168
+ try {
169
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
170
+ if (platform !== 'win32') {
171
+ const df = execSync('df -h . | tail -1', { encoding: 'utf8' });
172
+ const available = df.split(/\s+/)[3];
173
+ checks.push({ name: 'Disk Space', status: 'pass', message: `${available} available` });
174
+ }
175
+ }
176
+ catch {
177
+ checks.push({ name: 'Disk Space', status: 'warn', message: 'unable to check' });
178
+ }
179
+ // 5. 网络连接检查
180
+ try {
181
+ await axios_1.default.get('https://registry.npmjs.org', { timeout: 5000 });
182
+ checks.push({ name: 'Network', status: 'pass', message: 'npm registry reachable ✓' });
183
+ }
184
+ catch {
185
+ checks.push({ name: 'Network', status: 'warn', message: 'npm registry unreachable' });
186
+ }
187
+ // 6. Electron 缓存检查
188
+ const os = await Promise.resolve().then(() => __importStar(require('os')));
189
+ const path = await Promise.resolve().then(() => __importStar(require('path')));
190
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
191
+ const electronCache = path.join(os.homedir(), '.electron');
192
+ if (fs.existsSync(electronCache)) {
193
+ const files = fs.readdirSync(electronCache);
194
+ checks.push({ name: 'Electron Cache', status: 'pass', message: `${files.length} versions cached` });
195
+ }
196
+ else {
197
+ checks.push({ name: 'Electron Cache', status: 'warn', message: 'no cache (first build will be slower)' });
198
+ }
199
+ const passed = checks.every((c) => c.status !== 'fail');
200
+ return { passed, checks };
201
+ }
202
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,sDAoBC;AAKD,4DAWC;AAKD,oDAkBC;AAKD,8BAqEC;AAvLD,8CAAgC;AAChC,kDAA0B;AAQ1B,gCAAgC;AAChC,MAAM,yBAAyB,GAA6B;IAC1D,4CAA4C;IAC5C,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,aAAa;IACxC,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,cAAc;CACf,CAAC;AAEF,UAAU;AACV,MAAM,oBAAoB,GAA2B;IACnD,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;CACb,CAAC;AAEF;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAe;;IAKnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAA,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,KAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;IAEvC,MAAM,eAAe,GAAG,yBAAyB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACpE,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC;IAE1C,IAAI,cAAkC,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,cAAc,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AACnD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,wBAAwB;IAC5C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAC9B,+CAA+C,EAC/C,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QACF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,OAAO,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,oBAAoB,CACxC,eAAuB;IAEvB,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAEtD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAC7E,GAAG,CAAC,IAAI,CAAC,eAAe,eAAe,EAAE,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,KAAK,CAAC,cAAc,eAAe,wCAAwC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS;IAI7B,MAAM,MAAM,GAA+E,EAAE,CAAC;IAE9F,kBAAkB;IAClB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,kBAAkB,EAAE,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,iBAAiB,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,cAAc;IACd,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAC;QACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,iBAAiB,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,UAAU;IACV,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,KAAK,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAE5F,mBAAmB;IACnB,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,YAAY,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,YAAY;IACZ,IAAI,CAAC;QACH,MAAM,eAAK,CAAC,GAAG,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,mBAAmB;IACnB,MAAM,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,wDAAa,MAAM,GAAC,CAAC;IAClC,MAAM,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAC;IAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;IACtG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACxD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 自动更新系统
3
+ * 为生成的应用添加自动更新能力
4
+ */
5
+ export interface UpdateConfig {
6
+ provider: 'github' | 'generic' | 's3' | 'spaces';
7
+ owner?: string;
8
+ repo?: string;
9
+ url?: string;
10
+ channel?: 'latest' | 'beta' | 'alpha';
11
+ allowDowngrade?: boolean;
12
+ allowPrerelease?: boolean;
13
+ }
14
+ /**
15
+ * 生成 electron-updater 配置
16
+ */
17
+ export declare function generateUpdaterConfig(config: UpdateConfig): Record<string, unknown>;
18
+ /**
19
+ * 生成自动更新的主进程代码
20
+ */
21
+ export declare function generateAutoUpdateCode(config: UpdateConfig): string;
22
+ /**
23
+ * 生成简化版更新检查代码(不依赖 electron-updater)
24
+ */
25
+ export declare function generateSimpleUpdateChecker(updateUrl: string): string;
26
+ /**
27
+ * 将更新代码注入到应用中
28
+ */
29
+ export declare function injectAutoUpdate(appPath: string, config: UpdateConfig | string): void;
30
+ /**
31
+ * 解析更新配置字符串
32
+ * 格式: github:owner/repo 或 https://update-server.com/updates
33
+ */
34
+ export declare function parseUpdateConfig(configStr: string): UpdateConfig | string;