platform.mjs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /** Platform policy is shared by startup, native menus and the renderer bridge.
  2. * A client-only build ships no local server runtime; main.mjs detects the
  3. * marker inside its runtime root and passes the policy down. The environment
  4. * variable keeps dev runs and tests on either policy. */
  5. import { statSync } from 'node:fs'
  6. import { join } from 'node:path'
  7. export function clientOnlyRuntime(root) {
  8. if (process.env.HERMES_YAOYAO_DESKTOP_CLIENT_ONLY === '1') return true
  9. try { return Boolean(statSync(join(root, 'client-only.marker')).isFile()) } catch { return false }
  10. }
  11. export function desktopPlatform(platform = process.platform, { clientOnly = false } = {}) {
  12. return Object.freeze({ platform, server: platform === 'darwin' && !clientOnly,
  13. supportedModes: platform === 'darwin' && !clientOnly ? ['client', 'server'] : ['client'],
  14. computer: ['darwin', 'win32'].includes(platform), windows: platform === 'win32' })
  15. }
  16. export function loginItemOptions(platform = process.platform, executable = process.execPath) {
  17. return platform === 'win32' ? { path: executable, args: ['--yaoyao-login'] } : {}
  18. }
  19. export function desktopMenu(template, platform = process.platform, { clientOnly = !desktopPlatform(platform).server } = {}) {
  20. if (!clientOnly) return platform === 'darwin' ? template : filterDesktopMenu(template, platform)
  21. return filterDesktopMenu(template, platform)
  22. }
  23. function filterDesktopMenu(template, platform) {
  24. const excluded = new Set(['desktop-local-vm', 'desktop-sync-notice', 'desktop-sync-retry',
  25. 'desktop-sync-force', 'desktop-stop-and-quit', 'desktop-host-use-local', 'desktop-host-ask'])
  26. const result = []
  27. for (const item of template) {
  28. if (excluded.has(item.id) || item.label === '执行节点' || ['hide', 'hideOthers', 'unhide'].includes(item.role)) continue
  29. const next = { ...item }
  30. if (next.submenu) next.submenu = filterDesktopMenu(next.submenu, platform)
  31. if (next.id === 'desktop-login') next.label = platform === 'win32' ? '登录 Windows 时启动' : '登录 Mac 时启动'
  32. if (next.id === 'desktop-background') next.label = '登录启动时仅驻留菜单栏'
  33. if (next.id === 'desktop-service-status') next.label = '尚未连接服务器'
  34. if (next.label === '退出夭夭(后台继续运行)') next.label = '退出夭夭'
  35. if (next.label === '停止后台服务并退出') continue
  36. if (next.type === 'separator' && (!result.length || result.at(-1).type === 'separator')) continue
  37. result.push(next)
  38. }
  39. if (result.at(-1)?.type === 'separator') result.pop()
  40. return result
  41. }