doesitarm/helpers/stork/executable.js
ThatGuySam 9e48862a5f fix(stork): support netlify ubuntu 24 builds
Switch Stork downloads to artifacts that match current runtimes and fix the runtime detection path that Node 22 changed.

This keeps the existing Stork pipeline working on Netlify's Noble image and on Apple Silicon development machines.
2026-03-15 11:57:41 -05:00

107 lines
2.9 KiB
JavaScript

// Stork and Netlify - https://stork-search.net/docs/stork-and-netlify
import fs from 'fs-extra'
import execa from 'execa'
import {
storkVersion,
storkExecutableName,
storkExecutablePath,
storkTomlPath,
storkIndexPath
} from '~/helpers/stork/config.js'
// Netlify's Ubuntu 24 (Noble) image needs the OpenSSL 3 compatible binary.
export function getStorkExecutableTarget ( {
platform = process.platform,
arch = process.arch
} = {} ) {
if ( platform === 'darwin' ) {
if ( arch === 'arm64' ) return 'stork-macos-13-arm'
return 'stork-macos-10-15'
}
return 'stork-ubuntu-22-04'
}
// https://stork-search.net/docs/install
export function getStorkExecutableDownloadUrl ( options = {} ) {
const target = getStorkExecutableTarget( options )
return `https://files.stork-search.net/releases/v${ storkVersion }/${ target }`
}
// Check if a file is executable
// https://stackoverflow.com/a/69897809/1397641
async function isExecutable ( path ) {
const stats = await fs.stat( path )
const isExecutable = !!(stats.mode & fs.constants.S_IXUSR)
return isExecutable
}
// 👩‍💻 Bash Download example - https://github.com/jmooring/hugo-stork/blob/main/build.sh
export async function downloadStorkExecutable () {
const execDownloadUrl = getStorkExecutableDownloadUrl()
// console.log( { execDownloadUrl } )
// Delete any existing executable
// so we don't get write errors
// or false positives from preexisting executable files
await fs.remove( storkExecutablePath )
// Download the binary
await execa( `curl`, [
'-fsSL',
execDownloadUrl,
// Set filename
'-o',
storkExecutableName
])
// Set the downloaded binary as executable
await fs.chmod( storkExecutablePath, '755' )
// Check that our downloaded binary is executable
// console.log( 'isExecutable', isExecutable )
if ( !(await isExecutable( storkExecutablePath )) ) throw new Error( `Downloaded binary at ${ storkExecutablePath } is not executable.` )
// Check Stork version
// so we know our binary is working
const { stdout } = await execa( storkExecutablePath, [
'--version'
])
console.log( 'Stork Version', stdout )
if ( !stdout.includes( storkVersion ) ) throw new Error( 'Stork --version command failed.' )
return stdout
}
export async function buildIndex () {
if ( !(await isExecutable( storkExecutablePath )) ) throw new Error( `Binary at ${ storkExecutablePath } is not executable.` )
// Check Stork version
// so we know our binary is working
const { stdout } = await execa( storkExecutablePath, [
'build',
'--input',
storkTomlPath,
'--output',
storkIndexPath
])
console.log( 'Stork Build', stdout )
if ( !stdout.includes( storkVersion ) ) throw new Error( 'Stork --version command failed.' )
return stdout
}