electerm 2.3.126 → 2.3.166

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 (3) hide show
  1. package/README.md +6 -5
  2. package/npm/install.js +206 -26
  3. package/package.json +8 -127
package/README.md CHANGED
@@ -133,12 +133,13 @@ wechat donate
133
133
  ## Dev
134
134
 
135
135
  ```bash
136
- # tested in ubuntu20.04+/mac os 10.13+ only
137
- # needs nodejs/npm, suggest using fnm to install nodejs/npm
136
+ # May only works in Linux
137
+ # needs nodejs/npm, suggest using nvm to install nodejs/npm
138
138
  # with nodejs 22.x
139
139
 
140
140
  git clone git@github.com:electerm/electerm.git
141
141
  cd electerm
142
+ npm config set legacy-peer-deps true
142
143
  npm i
143
144
 
144
145
  # start vite dev server, requires port 5570
@@ -168,7 +169,7 @@ npm run test
168
169
  ## Test build
169
170
 
170
171
  ```bash
171
- # Tested only in ubuntu 16.04 x64+
172
+ # May only works in Linux
172
173
  # Install yarn first(to do yarn autoclean)
173
174
  # See https://yarnpkg.com/en/docs/install
174
175
 
@@ -184,9 +185,9 @@ npm run pb
184
185
  ./node_modules/.bin/electron-builder --linux --arm64
185
186
  ```
186
187
 
187
- ## Video guides
188
+ ## Video guide
188
189
 
189
- - [bilibili](https://space.bilibili.com/14001525/channel/series?sid=5461229&spm_id_from=333.788.0.0)
190
+ - [https://electerm.html5beta.com/videos](https://electerm.html5beta.com/videos)
190
191
 
191
192
  ## Change log
192
193
 
package/npm/install.js CHANGED
@@ -8,12 +8,7 @@ const { exec, rm, mv } = require('shelljs')
8
8
  const rp = require('phin').promisified
9
9
  const download = require('download')
10
10
  const plat = os.platform()
11
- const isWin = plat === 'win32'
12
- const isMac = plat === 'darwin'
13
- const isLinux = plat === 'linux'
14
11
  const arch = os.arch()
15
- const isArm = arch === 'arm'
16
- const isArm64 = arch === 'arm64'
17
12
  const { homepage } = require('../package.json')
18
13
  const releaseInfoUrl = `${homepage}/data/electerm-github-release.json?_=${+new Date()}`
19
14
  const versionUrl = `${homepage}/version.html?_=${+new Date()}`
@@ -47,49 +42,234 @@ function getReleaseInfo (filter) {
47
42
  })
48
43
  }
49
44
 
50
- async function runLinux (name, nameWithExt) {
45
+ function showFinalMessage () {
46
+ console.log('\n========================================')
47
+ console.log('electerm installation complete!')
48
+ console.log('========================================')
49
+ console.log('\nFor more information, documentation, and updates, please visit:')
50
+ console.log('\x1b[36m%s\x1b[0m', 'https://electerm.html5beta.com')
51
+ console.log('\nThank you for using electerm!')
52
+ console.log('========================================\n')
53
+ }
54
+
55
+ // Check if running on Windows 7 or earlier
56
+ function isWindows7OrEarlier (platform, release) {
57
+ if (platform !== 'win32') return false
58
+ // Windows 7 is NT 6.1, Windows 8 is NT 6.2, Windows 10 is NT 10.0
59
+ const [major, minor] = release.split('.').map(Number)
60
+ return major < 10 && (major < 6 || (major === 6 && minor <= 1))
61
+ }
62
+
63
+ // Check if running on macOS 10.x (older than Big Sur 11.0)
64
+ function isMacOS10 (platform, release) {
65
+ if (platform !== 'darwin') return false
66
+ // Darwin kernel version: macOS 11 (Big Sur) = Darwin 20.x, macOS 10.15 = Darwin 19.x
67
+ const majorVersion = parseInt(release.split('.')[0], 10)
68
+ return majorVersion < 20
69
+ }
70
+
71
+ // Check if running on Linux with old glibc (< 2.34)
72
+ function isLinuxLegacy (platform, glibcVersion) {
73
+ if (platform !== 'linux') return false
74
+ if (typeof glibcVersion === 'number') {
75
+ return glibcVersion < 2.34
76
+ }
77
+ try {
78
+ const result = exec('ldd --version 2>&1 | head -n1', { silent: true })
79
+ if (result.code !== 0) return false
80
+ const output = result.stdout || ''
81
+ // Extract version number like "ldd (GNU libc) 2.31" or "ldd (Ubuntu GLIBC 2.35-0ubuntu3) 2.35"
82
+ const match = output.match(/(\d+\.\d+)\s*$/)
83
+ if (match) {
84
+ const version = parseFloat(match[1])
85
+ return version < 2.34
86
+ }
87
+ return false
88
+ } catch (e) {
89
+ return false
90
+ }
91
+ }
92
+
93
+ // Get the file pattern for download based on platform/arch/legacy status
94
+ function getDownloadPattern (platform, architecture, options = {}) {
95
+ const { win7, mac10, linuxLegacy } = options
96
+
97
+ if (platform === 'win32') {
98
+ if (win7) {
99
+ return { pattern: /electerm-\d+\.\d+\.\d+-win7\.tar\.gz$/, type: 'win7' }
100
+ } else if (architecture === 'arm64') {
101
+ return { pattern: /electerm-\d+\.\d+\.\d+-win-arm64\.tar\.gz$/, type: 'win-arm64' }
102
+ } else {
103
+ return { pattern: /electerm-\d+\.\d+\.\d+-win-x64\.tar\.gz$/, type: 'win-x64' }
104
+ }
105
+ } else if (platform === 'darwin') {
106
+ if (mac10) {
107
+ return { pattern: /mac10-x64\.dmg$/, type: 'mac10-x64' }
108
+ } else if (architecture === 'arm64') {
109
+ return { pattern: /mac-arm64\.dmg$/, type: 'mac-arm64' }
110
+ } else {
111
+ return { pattern: /mac-x64\.dmg$/, type: 'mac-x64' }
112
+ }
113
+ } else if (platform === 'linux') {
114
+ const suffix = linuxLegacy ? '-legacy' : ''
115
+ if (architecture === 'arm64') {
116
+ return { pattern: new RegExp(`linux-arm64${suffix}\\.tar\\.gz$`), type: `linux-arm64${suffix}` }
117
+ } else if (architecture === 'arm') {
118
+ return { pattern: new RegExp(`linux-armv7l${suffix}\\.tar\\.gz$`), type: `linux-armv7l${suffix}` }
119
+ } else {
120
+ return { pattern: new RegExp(`linux-x64${suffix}\\.tar\\.gz$`), type: `linux-x64${suffix}` }
121
+ }
122
+ }
123
+ return { pattern: null, type: 'unsupported' }
124
+ }
125
+
126
+ async function runLinux (folderName, filePattern) {
51
127
  const ver = await getVer()
52
- const target = resolve(__dirname, `../electerm-${ver.replace('v', '')}-${name}`)
128
+ const target = resolve(__dirname, `../electerm-${ver.replace('v', '')}-${folderName}`)
53
129
  const targetNew = resolve(__dirname, '../electerm')
54
130
  exec(`rm -rf ${target} ${targetNew}`)
55
- const releaseInfo = await getReleaseInfo(r => r.name.includes(nameWithExt))
131
+ const releaseInfo = await getReleaseInfo(r => r.name.includes(filePattern))
132
+ if (!releaseInfo) {
133
+ throw new Error(`No release found for pattern: ${filePattern}`)
134
+ }
56
135
  await down(releaseInfo.browser_download_url)
57
- // await down('http://192.168.0.67:7500/electerm-0.16.1.tar.gz')
58
136
  exec(`mv ${target} ${targetNew}`)
137
+ showFinalMessage()
59
138
  exec('electerm')
60
139
  }
61
140
 
62
- async function runMac () {
63
- const releaseInfo = await getReleaseInfo(r => /mac-x64\.dmg$/.test(r.name))
141
+ async function runMac (archName) {
142
+ const pattern = new RegExp(`mac-${archName}\\.dmg$`)
143
+ const releaseInfo = await getReleaseInfo(r => pattern.test(r.name))
144
+ if (!releaseInfo) {
145
+ throw new Error(`No release found for Mac ${archName}`)
146
+ }
64
147
  await down(releaseInfo.browser_download_url, false)
65
- // await down('http://192.168.0.67:7500/electerm-0.16.1-mac.dmg', false)
66
148
  const target = resolve(__dirname, '../', releaseInfo.name)
149
+ showFinalMessage()
67
150
  exec(`open ${target}`)
68
151
  }
69
152
 
70
- async function runWin () {
153
+ // macOS 10.x specific version
154
+ async function runMac10 () {
155
+ const releaseInfo = await getReleaseInfo(r => /mac10-x64\.dmg$/.test(r.name))
156
+ if (!releaseInfo) {
157
+ throw new Error('No release found for macOS 10.x')
158
+ }
159
+ await down(releaseInfo.browser_download_url, false)
160
+ const target = resolve(__dirname, '../', releaseInfo.name)
161
+ showFinalMessage()
162
+ exec(`open ${target}`)
163
+ }
164
+
165
+ async function runWin (archName) {
71
166
  const ver = await getVer()
72
- const target = resolve(__dirname, `../electerm-${ver.replace('v', '')}-win-x64`)
167
+ const target = resolve(__dirname, `../electerm-${ver.replace('v', '')}-win-${archName}`)
73
168
  const targetNew = resolve(__dirname, '../electerm')
74
169
  rm('-rf', [
75
170
  target,
76
171
  targetNew
77
172
  ])
78
- const releaseInfo = await getReleaseInfo(r => /electerm-\d+\.\d+\.\d+-win-x64\.tar\.gz/.test(r.name))
173
+ const pattern = new RegExp(`electerm-\\d+\\.\\d+\\.\\d+-win-${archName}\\.tar\\.gz$`)
174
+ const releaseInfo = await getReleaseInfo(r => pattern.test(r.name))
175
+ if (!releaseInfo) {
176
+ throw new Error(`No release found for Windows ${archName}`)
177
+ }
79
178
  await down(releaseInfo.browser_download_url)
80
- // await down('http://192.168.0.67:7500/electerm-0.16.1-win.tar.gz')
81
179
  await mv(target, targetNew)
180
+ showFinalMessage()
82
181
  require('child_process').execFile(`${targetNew}\\electerm.exe`)
83
182
  }
84
183
 
85
- if (isWin) {
86
- runWin()
87
- } else if (isMac) {
88
- runMac()
89
- } else if (isLinux && isArm) {
90
- runLinux('linux-armv7l', 'linux-armv7l.tar.gz')
91
- } else if (isLinux && isArm64) {
92
- runLinux('linux-arm64', 'linux-arm64.tar.gz')
93
- } else {
94
- throw new Error(`platform: ${plat}, arch: ${arch} not supported`)
184
+ // Windows 7 specific version
185
+ async function runWin7 () {
186
+ const ver = await getVer()
187
+ const target = resolve(__dirname, `../electerm-${ver.replace('v', '')}-win7`)
188
+ const targetNew = resolve(__dirname, '../electerm')
189
+ rm('-rf', [
190
+ target,
191
+ targetNew
192
+ ])
193
+ const releaseInfo = await getReleaseInfo(r => /electerm-\d+\.\d+\.\d+-win7\.tar\.gz$/.test(r.name))
194
+ if (!releaseInfo) {
195
+ throw new Error('No release found for Windows 7')
196
+ }
197
+ await down(releaseInfo.browser_download_url)
198
+ await mv(target, targetNew)
199
+ showFinalMessage()
200
+ require('child_process').execFile(`${targetNew}\\electerm.exe`)
201
+ }
202
+
203
+ async function main () {
204
+ console.log(`Detected platform: ${plat}, architecture: ${arch}`)
205
+
206
+ // Check for legacy systems
207
+ const win7 = isWindows7OrEarlier(plat, os.release())
208
+ const mac10 = isMacOS10(plat, os.release())
209
+ const linuxLegacy = isLinuxLegacy(plat)
210
+
211
+ if (win7) console.log('Detected: Windows 7 or earlier')
212
+ if (mac10) console.log('Detected: macOS 10.x')
213
+ if (linuxLegacy) console.log('Detected: Linux with glibc < 2.34 (legacy)')
214
+
215
+ console.log('Fetching release information...\n')
216
+
217
+ try {
218
+ if (plat === 'win32') {
219
+ // Windows: x64, arm64, win7
220
+ if (win7) {
221
+ await runWin7()
222
+ } else if (arch === 'arm64') {
223
+ await runWin('arm64')
224
+ } else {
225
+ // Default to x64 for all other Windows architectures
226
+ await runWin('x64')
227
+ }
228
+ } else if (plat === 'darwin') {
229
+ // macOS: x64, arm64, mac10
230
+ if (mac10) {
231
+ await runMac10()
232
+ } else if (arch === 'arm64') {
233
+ await runMac('arm64')
234
+ } else {
235
+ // Default to x64 for Intel Macs
236
+ await runMac('x64')
237
+ }
238
+ } else if (plat === 'linux') {
239
+ // Linux: x64, arm64, armv7l (with legacy variants)
240
+ const suffix = linuxLegacy ? '-legacy' : ''
241
+ if (arch === 'arm64') {
242
+ await runLinux(`linux-arm64${suffix}`, `linux-arm64${suffix}.tar.gz`)
243
+ } else if (arch === 'arm') {
244
+ await runLinux(`linux-armv7l${suffix}`, `linux-armv7l${suffix}.tar.gz`)
245
+ } else {
246
+ // Default to x64 for all other Linux architectures
247
+ await runLinux(`linux-x64${suffix}`, `linux-x64${suffix}.tar.gz`)
248
+ }
249
+ } else {
250
+ throw new Error(`Platform "${plat}" is not supported.`)
251
+ }
252
+ } catch (err) {
253
+ console.error('\n========================================')
254
+ console.error('Installation failed!')
255
+ console.error('========================================')
256
+ console.error(`Error: ${err.message}`)
257
+ console.error(`\nPlatform: ${plat}, Architecture: ${arch}`)
258
+ console.error('\nPlease visit https://electerm.html5beta.com for manual download options.')
259
+ console.error('========================================\n')
260
+ process.exit(1)
261
+ }
262
+ }
263
+
264
+ // Export functions for testing
265
+ module.exports = {
266
+ isWindows7OrEarlier,
267
+ isMacOS10,
268
+ isLinuxLegacy,
269
+ getDownloadPattern
270
+ }
271
+
272
+ // Run main only if this file is executed directly
273
+ if (require.main === module) {
274
+ main()
95
275
  }
package/package.json CHANGED
@@ -1,39 +1,14 @@
1
1
  {
2
2
  "name": "electerm",
3
- "version": "2.3.126",
3
+ "version": "2.3.166",
4
4
  "description": "Terminal/ssh/telnet/serialport/sftp client(linux, mac, win)",
5
5
  "main": "app.js",
6
6
  "bin": "npm/electerm",
7
7
  "scripts": {
8
- "app": "node build/bin/app",
9
- "build": "npm run vite-build",
10
- "start": "node build/bin/start.js",
11
- "icon": "node build/bin/icon",
12
- "clean": "node build/bin/clean",
13
- "compile": "node build/bin/build",
14
- "vite-build": "node build/bin/vite-build.js",
15
- "prepublishOnly": "node build/bin/prepublish",
16
- "postpublish": "node build/bin/postpublish",
17
- "prepare-file": "node build/bin/prepare",
18
- "pb": "node build/bin/prepare-electron-build.js",
19
- "prepare-test": "PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -E playwright@1.28.1 --no-save && npm i -E @playwright/test@1.28.1 --no-save",
20
- "postinstall": "node build/bin/post-install",
21
- "lint": "./node_modules/.bin/standard --verbose",
22
- "fix": "./node_modules/.bin/standard --fix",
23
- "test": "npm run test1 && npm run test2",
24
- "test1": "./node_modules/.bin/playwright test test/e2e/00*.js --workers=1",
25
- "test2": "./node_modules/.bin/playwright test test/e2e/01*.js --workers=1",
26
- "b": "npm run clean && npm run compile && npm run prepare-file",
27
- "r": "./build/bin/release",
28
- "w": "./build/bin/web-release",
29
- "t": "./node_modules/.bin/electron work/app/app.js",
30
- "lock": "npm i --package-lock-only"
8
+ "postinstall": "node npm/install.js",
9
+ "postpublish": "node bin/postpublish.js"
31
10
  },
32
11
  "license": "MIT",
33
- "langugeRepo": "https://github.com/electerm/electerm-locales",
34
- "privacyNoticeLink": "https://github.com/electerm/electerm/wiki/privacy-notice",
35
- "knownIssuesLink": "https://github.com/electerm/electerm/wiki/Know-issues",
36
- "sponsorLink": "https://electerm.html5beta.com/sponsor-electerm.html",
37
12
  "repository": {
38
13
  "type": "git",
39
14
  "url": "git+https://github.com/electerm/electerm.git"
@@ -47,112 +22,18 @@
47
22
  "url": "https://github.com/electerm/electerm/issues"
48
23
  },
49
24
  "homepage": "https://electerm.html5beta.com",
50
- "releases": "https://github.com/electerm/electerm/releases",
51
25
  "engines": {
52
26
  "node": ">=16.0.0"
53
27
  },
54
28
  "preferGlobal": true,
55
- "devDependencies": {
56
- "@ant-design/icons": "5.6.1",
57
- "@electerm/electerm-resource": "1.3.7",
58
- "@electron/rebuild": "4.0.1",
59
- "@fontsource/maple-mono": "^5.2.5",
60
- "@novnc/novnc": "1.4.0",
61
- "@types/node": "22.9.3",
62
- "@vitejs/plugin-react": "4.3.4",
63
- "@xterm/addon-attach": "0.11.0",
64
- "@xterm/addon-canvas": "0.7.0",
65
- "@xterm/addon-fit": "0.10.0",
66
- "@xterm/addon-ligatures": "0.9.0",
67
- "@xterm/addon-search": "0.15.0",
68
- "@xterm/addon-unicode11": "0.8.0",
69
- "@xterm/addon-web-links": "0.11.0",
70
- "@xterm/addon-webgl": "0.18.0",
71
- "@xterm/xterm": "5.5.0",
72
- "antd": "5.27.1",
73
- "classnames": "2.5.1",
74
- "cross-env": "7.0.3",
75
- "dotenv": "16.4.5",
76
- "electerm-icons": "1.0.1",
77
- "electron": "38.2.2",
78
- "electron-builder": "26.0.20",
79
- "filesize": "10.1.6",
80
- "filesize-parser": "1.5.1",
81
- "firacode": "^6.2.0",
82
- "ftp-srv": "^4.6.3",
83
- "glob": "^11.0.0",
84
- "lodash-es": "^4.17.21",
85
- "manate": "2.0.0",
86
- "morgan": "1.10.1",
87
- "pug": "3.0.3",
88
- "react": "18.3.1",
89
- "react-colorful": "^5.6.1",
90
- "react-delta-hooks": "1.1.5",
91
- "react-dom": "18.3.1",
92
- "react-markdown": "9.0.1",
93
- "replace-in-file": "6.3.5",
94
- "shelljs": "0.8.5",
95
- "standard": "^17.1.0",
96
- "stylus": "^0.64.0",
97
- "trzsz": "^1.1.3",
98
- "vite": "6.3.6",
99
- "vite-plugin-commonjs": "0.10.4",
100
- "zmodem-ts": "1.0.4"
101
- },
102
29
  "dependencies": {
103
- "@electerm/electerm-locales": "2.1.53",
104
- "@electerm/electerm-themes": "^1.0.1",
105
- "@electerm/nedb": "1.8.0",
106
- "@electerm/rdpjs": "^1.0.0",
107
- "@electerm/ssh2": "1.16.2",
108
- "@electerm/strip-ansi": "1.0.0",
109
- "axios": "1.12.2",
110
- "basic-ftp": "^5.0.5",
111
- "commander": "12.1.0",
112
- "diffie-hellman": "^5.0.3",
113
- "electerm-sync": "1.2.1",
114
- "electron-log": "4.3.5",
115
- "express": "4.21.2",
116
- "express-ws": "5.0.2",
117
- "fast-deep-equal": "3.1.3",
118
- "find-free-port": "2.0.0",
119
- "font-list": "1.5.1",
120
- "gist-wrapper": "0.4.1",
121
- "gitee-client": "0.2.0",
122
- "https-proxy-agent": "7.0.1",
123
- "json-deep-copy": "1.3.1",
124
- "jsonwebtoken": "^9.0.1",
125
- "nanoid": "3.3.8",
126
- "node-bash": "5.0.1",
127
- "node-pty": "1.1.0-beta34",
128
- "os-locale-s": "1.0.8",
129
- "serialport": "13.0.0",
130
- "socks": "2.7.1",
131
- "socks-proxy-agent": "8.0.1",
132
- "socksv5-electron": "^0.0.6",
133
- "ssh-config": "5.0.1",
134
- "tar": "7.4.3"
30
+ "shelljs": "*",
31
+ "phin": "*",
32
+ "download": "*"
135
33
  },
136
34
  "files": [
137
35
  "npm",
138
36
  "README.md",
139
37
  "LICENSE"
140
- ],
141
- "standard": {
142
- "sourceType": "module",
143
- "ignore": [
144
- "/app/assets/",
145
- "src/client/entry/rle.js"
146
- ],
147
- "globals": [
148
- "log",
149
- "MouseEvent",
150
- "WebSocket",
151
- "FileReader",
152
- "CustomEvent",
153
- "onmessage",
154
- "requestAnimationFrame",
155
- "self"
156
- ]
157
- }
158
- }
38
+ ]
39
+ }