import { addValue, Arch, archFromString, ArchType, asArray } from "builder-util" import { DEFAULT_TARGET, DIR_TARGET, Platform, Target, TargetConfiguration } from "../core" import { PlatformPackager } from "../platformPackager" import { ArchiveTarget } from "./ArchiveTarget" const archiveTargets = new Set(["zip", "7z", "tar.xz", "tar.lz", "tar.gz", "tar.bz2"]) export function computeArchToTargetNamesMap(raw: Map>, platformPackager: PlatformPackager, platform: Platform): Map> { for (const targetNames of raw.values()) { if (targetNames.length > 0) { // https://github.com/electron-userland/electron-builder/issues/1355 return raw } } const defaultArchs: Array = raw.size === 0 ? [process.arch as ArchType] : Array.from(raw.keys()).map(it => Arch[it] as ArchType) const result = new Map(raw) for (const target of asArray(platformPackager.platformSpecificBuildOptions.target).map(it => (typeof it === "string" ? { target: it } : it))) { let name = target.target let archs = target.arch const suffixPos = name.lastIndexOf(":") if (suffixPos > 0) { name = target.target.substring(0, suffixPos) if (archs == null) { archs = target.target.substring(suffixPos + 1) as ArchType } } for (const arch of archs == null ? defaultArchs : asArray(archs)) { addValue(result, archFromString(arch), name) } } if (result.size === 0) { const defaultTarget = platformPackager.defaultTarget if (raw.size === 0 && platform === Platform.LINUX && (process.platform === "darwin" || process.platform === "win32")) { result.set(Arch.x64, defaultTarget) // cannot enable arm because of native dependencies - e.g. keytar doesn't provide pre-builds for arm // result.set(Arch.armv7l, ["snap"]) } else { for (const arch of defaultArchs) { result.set(archFromString(arch), defaultTarget) } } } return result } export function createTargets(nameToTarget: Map, rawList: Array, outDir: string, packager: PlatformPackager): Array { const result: Array = [] const mapper = (name: string, factory: (outDir: string) => Target) => { let target = nameToTarget.get(name) if (target == null) { target = factory(outDir) nameToTarget.set(name, target) } result.push(target) } const targets = normalizeTargets(rawList, packager.defaultTarget) packager.createTargets(targets, mapper) return result } function normalizeTargets(targets: Array, defaultTarget: Array): Array { const list: Array = [] for (const t of targets) { const name = t.toLowerCase().trim() if (name === DEFAULT_TARGET) { list.push(...defaultTarget) } else { list.push(name) } } return list } export function createCommonTarget(target: string, outDir: string, packager: PlatformPackager): Target { if (archiveTargets.has(target)) { return new ArchiveTarget(target, outDir, packager) } else if (target === DIR_TARGET) { return new NoOpTarget(DIR_TARGET) } else { throw new Error(`Unknown target: ${target}`) } } export class NoOpTarget extends Target { readonly options = null constructor(name: string) { super(name) } get outDir(): string { throw new Error("NoOpTarget") } // eslint-disable-next-line async build(appOutDir: string, arch: Arch): Promise { // no build } }