import ejs from 'ejs' import * as fs from 'fs-extra' import * as path from 'path' import { FACTORY_PACKAGE_VERSION, WORKING_DIR } from '..' import type { App } from '../apps/_default' import { downloadArchive } from './downloadArchive' import { publishPackage } from './publishPackage' import { unzipArchive } from './unzipArchive' type ReleaseSpecificAppInfo = App & { version: string platform: string arch: string binaryUrl: string shouldPublish: boolean } type ReleaseSpecificContext = ReleaseSpecificAppInfo & { packageName: string } export async function createBinPackage(releaseInfo: ReleaseSpecificAppInfo) { const { name, slug, binaryName, version, platform, arch, binaryUrl } = releaseInfo const packageName = `gobot-${slug}-${platform}-${arch}` const packageVersion = `${version}-${FACTORY_PACKAGE_VERSION}` const packageDir = path.join(WORKING_DIR, `${packageName}-${packageVersion}`) console.log( `Creating package ${packageName}@${packageVersion} in ${packageDir}`, ) await fs.ensureDir(packageDir) const zipFilePath = path.join(packageDir, path.basename(binaryUrl)) if (!fs.existsSync(zipFilePath)) { await downloadArchive(binaryUrl, zipFilePath) } const buildDest = path.join(packageDir, 'build') const finalBinaryName = [binaryName, platform === `windows` ? '.exe' : ''] .filter((s) => s) .join('') const finalBinaryPath = path.join(buildDest, finalBinaryName) if (!fs.existsSync(finalBinaryPath)) { console.log(`Removing ${buildDest} and ${zipFilePath}`) fs.rmdirSync(buildDest, { recursive: true }) try { await unzipArchive(zipFilePath, buildDest) } catch (error) { console.error(`Error unzipping: ${error}`) fs.rmSync(zipFilePath) } } await fs.chmod(finalBinaryPath, '755') const packageJson = { name: packageName, repository: { type: 'git', url: 'git+https://github.com/benallfree/gobot.git', }, description: `Binary package for ${name} on ${platform}-${arch}. Part of the Gobot project.`, author: 'Ben Allfree', license: 'MIT', bugs: { url: 'https://github.com/benallfree/gobot/issues', }, homepage: 'https://github.com/benallfree/gobot', version: packageVersion, platform, arch, binVersion: version, proxyVersion: FACTORY_PACKAGE_VERSION, main: finalBinaryName, } await fs.writeJson(path.join(buildDest, 'package.json'), packageJson, { spaces: 2, }) const readme = ejs.compile( fs.readFileSync( path.join('src', `templates`, `binary`, `README.md`), 'utf8', ), ) const context: ReleaseSpecificContext = { ...releaseInfo, packageName, } await fs.writeFile(path.join(buildDest, 'README.md'), readme(context)) if (releaseInfo.shouldPublish) { await publishPackage(packageName, packageVersion, buildDest) } }