electron-builder.config.mjs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import {
  2. resolveDesktopAppId,
  3. resolveMacOSNotarizationEnvironment,
  4. resolveMacOSSigningEnvironment,
  5. } from './scripts/desktop-release-environment.mjs'
  6. import { notarizeMacOSDiskImageArtifact } from './scripts/notarize-macos-disk-images.mjs'
  7. import { verifyMacOSSignatureAfterSign } from './scripts/verify-macos-signature.mjs'
  8. import {
  9. createWindowsTokenSigner,
  10. installWindowsNsisBootstrapSigner,
  11. } from './scripts/windows-sign.mjs'
  12. /**
  13. * Create electron-builder configuration from one release environment.
  14. * @param {NodeJS.ProcessEnv} env - Packaging environment.
  15. * @param {NodeJS.Platform} hostPlatform - Build-host platform used when no explicit target is present.
  16. * @returns {object} electron-builder configuration.
  17. */
  18. export function createElectronBuilderConfig(env = process.env, hostPlatform = process.platform) {
  19. const appId = resolveDesktopAppId(env)
  20. const targetPlatform = env.DSH_DESKTOP_TARGET_PLATFORM
  21. const packagesMacOS = targetPlatform === 'darwin' || (targetPlatform === undefined && hostPlatform === 'darwin')
  22. const packagesWindows = targetPlatform === 'win32'
  23. const macOSSigning = packagesMacOS ? resolveMacOSSigningEnvironment(env) : undefined
  24. if (packagesMacOS) resolveMacOSNotarizationEnvironment(env)
  25. const windowsSigner = packagesWindows
  26. ? createWindowsTokenSigner({
  27. certificateFile: env.DSH_DESKTOP_WINDOWS_CER_FILE,
  28. signTool: env.DSH_DESKTOP_WINDOWS_SIGNTOOL,
  29. tokenPin: env.DSH_DESKTOP_WINDOWS_TOKEN_PIN,
  30. keyContainer: env.DSH_DESKTOP_WINDOWS_KEY_CONTAINER,
  31. })
  32. : undefined
  33. if (windowsSigner !== undefined) {
  34. installWindowsNsisBootstrapSigner({ sign: windowsSigner })
  35. }
  36. const publishUrl = env.DSH_DESKTOP_SHELL_UPDATE_URL
  37. return {
  38. appId,
  39. productName: 'DeepSeek Harness',
  40. artifactName: 'deepseek-harness-${version}-${os}-${arch}.${ext}',
  41. directories: { output: '.desktop-build/artifacts' },
  42. asar: true,
  43. files: [
  44. 'lib/*.js',
  45. 'lib/*.cjs',
  46. 'renderer/**/*',
  47. 'package.json',
  48. ],
  49. extraResources: [
  50. { from: '.desktop-build/runtime', to: 'runtime' },
  51. { from: '.desktop-build/seed', to: 'seed' },
  52. ],
  53. mac: {
  54. category: 'public.app-category.developer-tools',
  55. identity: macOSSigning?.signingIdentity,
  56. forceCodeSigning: true,
  57. hardenedRuntime: true,
  58. notarize: true,
  59. target: ['dmg', 'zip'],
  60. },
  61. dmg: {
  62. sign: true,
  63. writeUpdateInfo: false,
  64. },
  65. afterSign: context => {
  66. if (context.electronPlatformName !== 'darwin') return
  67. verifyMacOSSignatureAfterSign(context, macOSSigning ?? resolveMacOSSigningEnvironment(env))
  68. },
  69. artifactBuildCompleted: artifact => {
  70. if (!artifact.file.endsWith('.dmg')) return
  71. return notarizeMacOSDiskImageArtifact(
  72. artifact,
  73. env,
  74. macOSSigning ?? resolveMacOSSigningEnvironment(env),
  75. )
  76. },
  77. win: {
  78. forceCodeSigning: true,
  79. signtoolOptions: {
  80. sign: windowsSigner,
  81. signingHashAlgorithms: ['sha256'],
  82. },
  83. target: ['nsis'],
  84. },
  85. linux: {
  86. category: 'Development',
  87. target: ['AppImage'],
  88. },
  89. nsis: {
  90. oneClick: false,
  91. allowToChangeInstallationDirectory: true,
  92. differentialPackage: true,
  93. },
  94. publish: publishUrl === undefined || publishUrl === ''
  95. ? null
  96. : [{ provider: 'generic', url: publishUrl }],
  97. }
  98. }
  99. export default createElectronBuilderConfig()