electron-builder.config.mjs 3.8 KB

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