diff --git a/.changeset/plenty-tools-invite.md b/.changeset/plenty-tools-invite.md new file mode 100644 index 0000000..2884645 --- /dev/null +++ b/.changeset/plenty-tools-invite.md @@ -0,0 +1,7 @@ +--- +"create-solana-program": patch +--- + +Improve Solana version link script + +`pnpm solana:link` now also asks you to download the required Solana version if it's not already installed. Additionally, if the required Solana version is equal to or greater than `1.18.19`, the install URL will use `release.anza.xyz` instead of `release.solana.com`. diff --git a/template/base/scripts/check-solana-version.mjs b/template/base/scripts/check-solana-version.mjs index f0844be..28c1d19 100644 --- a/template/base/scripts/check-solana-version.mjs +++ b/template/base/scripts/check-solana-version.mjs @@ -5,7 +5,13 @@ import { getInstalledSolanaVersion, getSolanaVersion } from './utils.mjs'; const expectedVersion = getSolanaVersion(); const installedVersion = await getInstalledSolanaVersion(); -if (installedVersion !== expectedVersion) { +if (!installedVersion) { + echo( + chalk.red('[ ERROR ]'), + `No Solana installation found. Please install Solana ${expectedVersion} before proceeding.` + ); + process.exit(1); +} else if (installedVersion !== expectedVersion) { echo( chalk.yellow('[ WARNING ]'), `The installed Solana version ${installedVersion} does not match the expected version ${expectedVersion}.` diff --git a/template/base/scripts/link-solana-version.mjs b/template/base/scripts/link-solana-version.mjs index acc0a04..f92ae45 100644 --- a/template/base/scripts/link-solana-version.mjs +++ b/template/base/scripts/link-solana-version.mjs @@ -2,16 +2,8 @@ import 'zx/globals'; import { getInstalledSolanaVersion, getSolanaVersion } from './utils.mjs'; -const installedVersion = await getInstalledSolanaVersion(); const expectedVersion = getSolanaVersion(); - -if (installedVersion === expectedVersion) { - echo( - chalk.green('[ SUCCESS ]'), - `The expected Solana version ${expectedVersion} is installed.` - ); - process.exit(0); -} +const installedVersion = await getInstalledSolanaVersion(); const installPath = path.join( os.homedir(), @@ -29,28 +21,54 @@ const releasePath = path.join( const activeReleasePath = path.join(installPath, 'active_release'); const hasRelease = await fs.exists(releasePath); -if (hasRelease) { +if (!installedVersion) { + echo( + chalk.red('[ ERROR ]'), + `No Solana installation found. Solana ${expectedVersion} is required for this project.` + ); + await askToInstallSolana(expectedVersion); +} else if (installedVersion === expectedVersion) { + echo( + chalk.green('[ SUCCESS ]'), + `The expected Solana version ${expectedVersion} is installed.` + ); +} else if (hasRelease) { await $`rm -f "${activeReleasePath}"`; await $`ln -s "${releasePath}" "${activeReleasePath}"`; echo( chalk.green('[ SUCCESS ]'), `Successfully switched from Solana version ${installedVersion} to ${expectedVersion} to match the project's requirements.` ); - process.exit(0); +} else { + echo( + chalk.yellow('[ WARNING ]'), + `Cannot switch from Solana version ${installedVersion} to ${expectedVersion} because it is not installed.` + ); + await askToInstallSolana(expectedVersion); } -echo( - chalk.yellow('[ WARNING ]'), - `Cannot switch from Solana version ${installedVersion} to ${expectedVersion} because it is not installed.` -); - -const installRelease = await question('Should we install it now? [y/N] '); -if (installRelease === 'y') { - echo(`Installing Solana ${expectedVersion}...`); - await $`sh -c "$(curl -sSfL https://release.solana.com/v${expectedVersion}/install)"`; +async function askToInstallSolana(version) { + const installRelease = await question('Should we install it now? [y/N] '); + if (installRelease === 'y') { + await installSolana(version); + echo( + chalk.green('[ SUCCESS ]'), + `Successfully installed Solana version ${version}.` + ); + } else { + process.exit(1); + } } -echo( - chalk.green('[ SUCCESS ]'), - `Successfully switched from Solana version ${installedVersion} to ${expectedVersion} to match the project's requirements.` -); +async function installSolana(version) { + echo(`Installing Solana ${version}...`); + const cutoff = '1.18.19'; + const isBeforeCutoff = + (await $`[[ "$(printf '%s\n' "${cutoff}" "${version}" | sort -V | head -n1)" = "${version}" ]] && [[ "${cutoff}" != "${version}" ]]`.quiet() + .exitCode) == 0; + if (isBeforeCutoff) { + await $`sh -c "$(curl -sSfL https://release.solana.com/v${version}/install)"`; + } else { + await $`sh -c "$(curl -sSfL https://release.anza.xyz/v${version}/install)"`; + } +} diff --git a/template/base/scripts/utils.mjs b/template/base/scripts/utils.mjs index 274f217..44ee564 100644 --- a/template/base/scripts/utils.mjs +++ b/template/base/scripts/utils.mjs @@ -121,10 +121,6 @@ export async function getInstalledSolanaVersion() { const { stdout } = await $`solana --version`.quiet(); return stdout.match(/(\d+\.\d+\.\d+)/)?.[1]; } catch (error) { - echo( - chalk.red('[ ERROR ]'), - `No Solana installation found. Please install Solana ${getSolanaVersion()} before proceeding.` - ); - process.exit(1); + return ''; } }