1
mirror of https://github.com/jakejarvis/hugo-extended.git synced 2025-04-26 07:55:21 -04:00
hugo-extended/install.js

105 lines
4.0 KiB
JavaScript

'use strict';
const fs = require("fs");
const path = require("path");
const { https } = require("follow-redirects");
const decompress = require('decompress');
(async () => {
install()
.then(() => {
console.log('✔ Hugo installed successfully!');
})
.catch((error) => {
console.error('✖ ERROR: Hugo installation failed. :(\n', error);
});
})();
async function install() {
// this package's version number (should) always matches the Hugo version we want
const { version } = require('./package.json');
const downloadBaseUrl = `https://github.com/gohugoio/hugo/releases/download/v${version}/`;
// Hugo Extended supports: macOS x64, macOS ARM64, Linux x64, Windows x64.
// all other combos fall back to vanilla Hugo.
const downloadFile =
process.platform === 'darwin' && process.arch === 'x64'
? `hugo_extended_${version}_macOS-64bit.tar.gz` :
process.platform === 'darwin' && process.arch === 'arm64'
? `hugo_extended_${version}_macOS-ARM64.tar.gz` :
process.platform === 'win32' && process.arch === 'x64'
? `hugo_extended_${version}_Windows-64bit.zip` :
process.platform === 'win32' && process.arch.endsWith('32')
? `hugo_${version}_Windows-32bit.zip` :
process.platform === 'linux' && process.arch === 'x64'
? `hugo_extended_${version}_Linux-64bit.tar.gz` :
process.platform === 'linux' && process.arch.endsWith('32')
? `hugo_${version}_Linux-32bit.tar.gz` :
process.platform === 'linux' && process.arch === 'arm'
? `hugo_${version}_Linux-ARM.tar.gz` :
process.platform === 'linux' && process.arch === 'arm64'
? `hugo_${version}_Linux-ARM64.tar.gz` :
process.platform === 'freebsd' && process.arch === 'x64'
? `hugo_${version}_FreeBSD-64bit.tar.gz` :
process.platform === 'freebsd' && process.arch.endsWith('32')
? `hugo_${version}_FreeBSD-32bit.tar.gz` :
process.platform === 'freebsd' && process.arch === 'arm'
? `hugo_${version}_FreeBSD-ARM.tar.gz` :
process.platform === 'freebsd' && process.arch === 'arm64'
? `hugo_${version}_FreeBSD-ARM64.tar.gz` :
process.platform === 'openbsd' && process.arch === 'x64'
? `hugo_${version}_OpenBSD-64bit.tar.gz` :
process.platform === 'openbsd' && process.arch.endsWith('32')
? `hugo_${version}_OpenBSD-32bit.tar.gz` :
process.platform === 'openbsd' && process.arch === 'arm'
? `hugo_${version}_OpenBSD-ARM.tar.gz` :
process.platform === 'openbsd' && process.arch === 'arm64'
? `hugo_${version}_OpenBSD-ARM64.tar.gz` :
null;
// stop here if there's nothing we can download
if (!downloadFile) throw "Are you sure this platform is supported?";
let downloadUrl = downloadBaseUrl + downloadFile;
let vendorDir = path.join(__dirname, 'vendor');
let archivePath = path.join(vendorDir, downloadFile);
let binName = process.platform === 'win32' ? 'hugo.exe' : 'hugo';
let binPath = path.join(vendorDir, binName);
try {
// ensure the target directory exists
await fs.promises.mkdir(vendorDir, { recursive: true });
// fetch the archive file from GitHub
await new Promise((resolve, reject) => https.get(downloadUrl, response => {
// throw an error immediately if the download failed
if (response.statusCode !== 200) {
response.resume();
reject(new Error(`Download failed: status code ${response.statusCode} from ${downloadUrl}`));
return;
}
// pipe the response directly to a file
response.pipe(
fs.createWriteStream(archivePath)
.on('finish', resolve)
.on('error', reject)
);
}).on('error', reject));
// TODO: validate the checksum of the download
// https://github.com/jakejarvis/hugo-extended/issues/1
// extract the downloaded file
await decompress(archivePath, vendorDir);
} finally {
// delete the downloaded archive when finished
if (fs.existsSync(archivePath)) {
await fs.promises.unlink(archivePath);
}
}
// return the full path to our Hugo binary
return binPath;
}