preload.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { ipcRenderer, contextBridge } from 'electron'
  2. async function getOcticonSvg (name: string) {
  3. try {
  4. const response = await fetch(`octicon/${name}.svg`)
  5. const div = document.createElement('div')
  6. div.innerHTML = await response.text()
  7. return div
  8. } catch {
  9. return null
  10. }
  11. }
  12. async function loadSVG (element: HTMLSpanElement) {
  13. for (const cssClass of element.classList) {
  14. if (cssClass.startsWith('octicon-')) {
  15. const icon = await getOcticonSvg(cssClass.substr(8))
  16. if (icon) {
  17. for (const elemClass of element.classList) {
  18. icon.classList.add(elemClass)
  19. }
  20. element.before(icon)
  21. element.remove()
  22. break
  23. }
  24. }
  25. }
  26. }
  27. async function initialize () {
  28. const electronPath = await ipcRenderer.invoke('bootstrap')
  29. function replaceText (selector: string, text: string) {
  30. const element = document.querySelector<HTMLElement>(selector)
  31. if (element) {
  32. element.innerText = text
  33. }
  34. }
  35. replaceText('.electron-version', `Electron v${process.versions.electron}`)
  36. replaceText('.chrome-version', `Chromium v${process.versions.chrome}`)
  37. replaceText('.node-version', `Node v${process.versions.node}`)
  38. replaceText('.v8-version', `v8 v${process.versions.v8}`)
  39. replaceText('.command-example', `${electronPath} path-to-app`)
  40. for (const element of document.querySelectorAll<HTMLSpanElement>('.octicon')) {
  41. loadSVG(element)
  42. }
  43. }
  44. contextBridge.exposeInMainWorld('electronDefaultApp', {
  45. initialize
  46. })