Repository: electron-userland/electron-builder
File: packages/app-builder-lib/src/targets/nsis/NsisTarget.ts (TypeScript)

Code before:
      withoutDir: true,
      compression: packager.compression,
      excluded: preCompressedFileExtensions == null ? null : preCompressedFileExtensions.map(it => `*${it}`),
    }

    const timer = time(`nsis package, ${Arch[arch]}`)
    await archive(format, archiveFile, appOutDir, isBuildDifferentialAware ? configureDifferentialAwareArchiveOptions(archiveOptions) : archiveOptions)
    timer.end()

    if (isBuildDifferentialAware && this.isWebInstaller) {
      const data = await appendBlockmap(archiveFile)
      return {
        ...data,
        path: archiveFile,
      }
    } else {
      return await createPackageFileInfo(archiveFile)
    }
  }

  protected installerFilenamePattern(primaryArch?: Arch | null, defaultArch?: string): string {
    if (!this.buildUniversalInstaller()) {
      return "${productName} " + (this.isPortable ? "" : "Setup ") + "${version}" + (primaryArch != null ? getArchSuffix(primaryArch, defaultArch) : "") + ".${ext}"
    }
    // tslint:disable:no-invalid-template-strings
    return "${productName} " + (this.isPortable ? "" : "Setup ") + "${version}.${ext}"
  }

  private get isPortable(): boolean {
    return this.name === "portable"
  }

  async finishBuild(): Promise<any> {
    if (!this.buildUniversalInstaller()) {
      return this.packageHelper.finishBuild()
    }
    try {
      const { pattern } = this.packager.artifactPatternConfig(this.options, this.installerFilenamePattern())
      const builds = new Set([this.archs])
      if (pattern.includes("${arch}") && this.archs.size > 1) {
        ;[...this.archs].forEach(([arch, appOutDir]) => builds.add(new Map().set(arch, appOutDir)))
      }
      const doBuildArchs = builds.values()
      for (const archs of doBuildArchs) {
        await this.buildInstaller(archs)
      }
    } finally {
      await this.packageHelper.finishBuild()
    }
  }


Review comment (suggestion):
```javascript
protected installerFilenamePattern(primaryArch?: Arch | null, defaultArch?: string): string {
  const setupText = this.isPortable ? "" : "Setup ";
  const archSuffix = !this.buildUniversalInstaller() && primaryArch != null 
    ? getArchSuffix(primaryArch, defaultArch) 
    : "";
  
  return "${productName} " + setupText + "${version}" + archSuffix + ".${ext}";
}
```

Code after:
      withoutDir: true,
      compression: packager.compression,
      excluded: preCompressedFileExtensions == null ? null : preCompressedFileExtensions.map(it => `*${it}`),
    }

    const timer = time(`nsis package, ${Arch[arch]}`)
    await archive(format, archiveFile, appOutDir, isBuildDifferentialAware ? configureDifferentialAwareArchiveOptions(archiveOptions) : archiveOptions)
    timer.end()

    if (isBuildDifferentialAware && this.isWebInstaller) {
      const data = await appendBlockmap(archiveFile)
      return {
        ...data,
        path: archiveFile,
      }
    } else {
      return await createPackageFileInfo(archiveFile)
    }
  }

  protected installerFilenamePattern(primaryArch?: Arch | null, defaultArch?: string): string {
    const setupText = this.isPortable ? "" : "Setup "
    const archSuffix = !this.shouldBuildUniversalInstaller && primaryArch != null ? getArchSuffix(primaryArch, defaultArch) : ""

    return "${productName} " + setupText + "${version}" + archSuffix + ".${ext}";
  }

  private get isPortable(): boolean {
    return this.name === "portable"
  }

  async finishBuild(): Promise<any> {
    if (!this.shouldBuildUniversalInstaller) {
      return this.packageHelper.finishBuild()
    }
    try {
      const { pattern } = this.packager.artifactPatternConfig(this.options, this.installerFilenamePattern())
      const builds = new Set([this.archs])
      if (pattern.includes("${arch}") && this.archs.size > 1) {
        ;[...this.archs].forEach(([arch, appOutDir]) => builds.add(new Map().set(arch, appOutDir)))
      }
      const doBuildArchs = builds.values()
      for (const archs of doBuildArchs) {
        await this.buildInstaller(archs)
      }
    } finally {
      await this.packageHelper.finishBuild()
    }
  }

  private async buildInstaller(archs: Map<Arch, string>): Promise<any> {