Skip to content

Commit 37be37b

Browse files
Check for required deps (#68)
2 parents e058f14 + 0bfca2e commit 37be37b

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"merge-packages": "^0.1.6",
5757
"ncp": "^2.0.0",
5858
"pkg-install": "1.0.0",
59+
"semver": "^7.6.3",
5960
"terminal-kit": "^3.1.1"
6061
},
6162
"packageManager": "[email protected]"

src/actions/setup-challenge.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { execa } from "execa";
2+
import semver, { Range } from 'semver';
23
import ncp from "ncp";
34
import path from "path";
45
import fs from "fs";
@@ -10,6 +11,8 @@ import { BASE_REPO, BASE_BRANCH, BASE_COMMIT } from "../config";
1011
import { DefaultRenderer, Listr, ListrTaskWrapper, SimpleRenderer } from "listr2";
1112
import chalk from "chalk";
1213

14+
type RequiredDependency = "node" | "git" | "yarn" | "foundryup";
15+
1316
// Sidestep for ncp issue https://github.com/AvianFlu/ncp/issues/127
1417
const copy = (source: string, destination: string, options?: ncp.Options) => new Promise((resolve, reject) => {
1518
ncp(source, destination, options || {}, (err) => {
@@ -57,6 +60,10 @@ export const setupChallenge = async (name: string, installLocation: string) => {
5760
}
5861

5962
const tasks = new Listr([
63+
{
64+
title: 'Checking for required dependencies',
65+
task: () => checkUserDependencies()
66+
},
6067
{
6168
title: 'Setting up base repository',
6269
task: () => setupBaseRepo(targetDir)
@@ -84,11 +91,39 @@ export const setupChallenge = async (name: string, installLocation: string) => {
8491
console.log(chalk.green("Challenge setup completed successfully."));
8592
console.log("");
8693
console.log(chalk.cyan(`Now open this repository in your favorite code editor and look at the readme for instructions: ${targetDir}`));
87-
} catch (error) {
88-
console.error(chalk.red("An error occurred during challenge setup:"), error);
94+
} catch (error: any) {
95+
console.error(chalk.red("An error occurred during challenge setup:"), error.message);
96+
}
97+
}
98+
99+
const checkDependencyInstalled = async (name: RequiredDependency) => {
100+
try {
101+
await execa(name, ["--help"]);
102+
} catch(_) {
103+
throw new Error(`${name} is required. Please install to continue.`);
89104
}
90105
}
91106

107+
const checkDependencyVersion = async (name: RequiredDependency, requiredVersion: string | Range) => {
108+
try {
109+
const userVersion = (await execa(name, ["--version"])).stdout;
110+
if (!semver.satisfies(userVersion, requiredVersion)) {
111+
throw new Error(`${name} version requirement of ${requiredVersion} not met. Please update to continue.`);
112+
}
113+
} catch(_) {
114+
throw new Error(`${name} ${requiredVersion} is required. Please install to continue.`);
115+
}
116+
}
117+
118+
export const checkUserDependencies = async () => {
119+
await Promise.all([
120+
checkDependencyVersion("node", ">=18.17.0"),
121+
checkDependencyInstalled("git"),
122+
checkDependencyInstalled("yarn"),
123+
checkDependencyInstalled("foundryup"),
124+
])
125+
}
126+
92127
const setupBaseRepo = async (targetDir: string): Promise<void> => {
93128
await execa("git", ["clone", "--branch", BASE_BRANCH, "--single-branch", BASE_REPO, targetDir]);
94129
await execa("git", ["checkout", BASE_COMMIT], { cwd: targetDir });

yarn.lock

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1630,6 +1630,7 @@ __metadata:
16301630
pkg-install: 1.0.0
16311631
rollup: 3.21.0
16321632
rollup-plugin-auto-external: 2.0.0
1633+
semver: ^7.6.3
16331634
terminal-kit: ^3.1.1
16341635
tslib: 2.5.0
16351636
typescript: 5.0.4
@@ -4157,6 +4158,15 @@ __metadata:
41574158
languageName: node
41584159
linkType: hard
41594160

4161+
"semver@npm:^7.6.3":
4162+
version: 7.6.3
4163+
resolution: "semver@npm:7.6.3"
4164+
bin:
4165+
semver: bin/semver.js
4166+
checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8
4167+
languageName: node
4168+
linkType: hard
4169+
41604170
"set-blocking@npm:^2.0.0":
41614171
version: 2.0.0
41624172
resolution: "set-blocking@npm:2.0.0"

0 commit comments

Comments
 (0)