You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.9 KiB
89 lines
2.9 KiB
import path from 'path';
|
|
import { promisify } from 'util';
|
|
|
|
import { MakerBase, MakerOptions } from '@electron-forge/maker-base';
|
|
import { ForgePlatform } from '@electron-forge/shared-types';
|
|
import fs from 'fs-extra';
|
|
import got from 'got';
|
|
|
|
import { MakerZIPConfig } from './Config';
|
|
|
|
type SquirrelMacRelease = {
|
|
version: string;
|
|
updateTo: {
|
|
version: string;
|
|
pub_date: string;
|
|
notes: string;
|
|
name: string;
|
|
url: string;
|
|
};
|
|
};
|
|
|
|
type SquirrelMacReleases = {
|
|
currentRelease: string;
|
|
releases: SquirrelMacRelease[];
|
|
};
|
|
|
|
export default class MakerZIP extends MakerBase<MakerZIPConfig> {
|
|
name = 'zip';
|
|
|
|
defaultPlatforms: ForgePlatform[] = ['darwin', 'mas', 'win32', 'linux'];
|
|
|
|
isSupportedOnCurrentPlatform(): boolean {
|
|
return true;
|
|
}
|
|
|
|
async make({ dir, makeDir, appName, packageJSON, targetArch, targetPlatform }: MakerOptions): Promise<string[]> {
|
|
const { zip } = require('cross-zip');
|
|
|
|
const zipDir = ['darwin', 'mas'].includes(targetPlatform) ? path.resolve(dir, `${appName}.app`) : dir;
|
|
|
|
const zipName = `${path.basename(dir)}-${packageJSON.version}.zip`;
|
|
const zipPath = path.resolve(makeDir, 'zip', targetPlatform, targetArch, zipName);
|
|
|
|
await this.ensureFile(zipPath);
|
|
await promisify(zip)(zipDir, zipPath);
|
|
|
|
// Only generate RELEASES.json for darwin builds (not MAS)
|
|
if (targetPlatform === 'darwin' && this.config.macUpdateManifestBaseUrl) {
|
|
const parsed = new URL(this.config.macUpdateManifestBaseUrl);
|
|
parsed.pathname += '/RELEASES.json';
|
|
const response = await got.get(parsed.toString());
|
|
let currentValue: SquirrelMacReleases = {
|
|
currentRelease: '',
|
|
releases: [],
|
|
};
|
|
if (response.statusCode === 200) {
|
|
currentValue = JSON.parse(response.body);
|
|
}
|
|
const updateUrl = new URL(this.config.macUpdateManifestBaseUrl);
|
|
updateUrl.pathname += `/${zipName}`;
|
|
// Remove existing release if it is already in the manifest
|
|
currentValue.releases = currentValue.releases || [];
|
|
currentValue.releases = currentValue.releases.filter((release) => release.version !== packageJSON.version);
|
|
// Add the current version as the current release
|
|
currentValue.currentRelease = packageJSON.version;
|
|
currentValue.releases.push({
|
|
version: packageJSON.version,
|
|
updateTo: {
|
|
name: `${appName} v${packageJSON.version}`,
|
|
version: packageJSON.version,
|
|
pub_date: new Date().toISOString(),
|
|
url: updateUrl.toString(),
|
|
notes: this.config.macUpdateReleaseNotes || '',
|
|
},
|
|
});
|
|
|
|
const releasesPath = path.resolve(makeDir, 'zip', targetPlatform, targetArch, 'RELEASES.json');
|
|
await this.ensureFile(releasesPath);
|
|
await fs.writeJson(releasesPath, currentValue);
|
|
|
|
return [zipPath, releasesPath];
|
|
}
|
|
|
|
return [zipPath];
|
|
}
|
|
}
|
|
|
|
export { MakerZIP, MakerZIPConfig };
|